JS 数据处理技巧及小算法汇总
前言:
金秋九月的最后一天,突然发现这个月博客啥也没更新,不写点什么总觉得这个月没啥长进,逆水行舟,不进则退,前进的路上贵在坚持,说好的每个月至少一到两篇,不能半途而废!好多知识写下来也能加深一下自身的记忆。所以在国庆前一天和大家分享下自己收藏的一些JS 的数组或对象处理或者非常简单的算法问题。
1、根据属性来更新一个数组中的对象
const arr = [ {id: , score: }, {id: , score: }, {id: , score: }];
//更新的值
const newValue = {id: 3, score: 3}
更新数组中id为3的score值。
Es6 装逼写法如下:
const result = initial.map(x => x.id === newValue.id ? newValue : x); //是不是很装B??
首先数组是利用数组map方法去遍历arr的每一个值,然后进行于newValue的id进行对比,不同返回原来的项,相同返回newValue.
不装逼清晰点写法:
const updated = arr.map(function(item){
return item.id == newValue.id ? newValue : item ;
});
2、数组去重
对于大神来说,我有一百种方法处理这个问题。
方案 A
// 遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组
function unique(ar) {
var ret = []; for (var i = , j = ar.length; i < j; i++) {
if (ret.indexOf(ar[i]) === -) {
ret.push(ar[i]);
}
} return ret;
}
方案B
//遍历数组,利用object对象保存数组值,判断数组值是否已经保存在object中,未保存则push到新数组并用object[arrayItem]=1的方式记录保存,这个效率比A高
function unique(ar) {
var tmp = {},
ret = []; for (var i = , j = ar.length; i < j; i++) {
if (!tmp[ar[i]]) {
tmp[ar[i]] = ;
ret.push(ar[i]);
}
} return ret;
}
方案C
//ES6
const numbers = [, , , , , , , , ];
const uniq = [...new Set(numbers)] // => [ 1, 2, 3, 4 ];
const uniq2 = Array.from(new Set(numbers)) // => [ 1, 2, 3, 4 ];
稍等,我还有方案D
方案D
//filter
function unique (arr) {
var res = arr.filter(function (item, index, array) {
return array.indexOf(item) === index; //array.indexOf(item) === index 说明这个元素第一次出现,后面这个item再出现他的item肯定不是index了
}) return res; }
欢迎大家留言区给出剩下96种方案。
三、根据属性删除数组中的一个对象
// 根据属性删除数组中的对象,利用filter进行过滤数组中id相同的项
const initial = [ {id: , score: }, {id: , score: }, {id: , score: }];
const removeId = ;
const without3 = initial.filter(x => x.id !== removeId);
console.log(without3) // => [ { id: 1, score: 1 }, { id: 2, score: 2 } ]
四、删除一个对象上的属性(key)
//利用es6的 ...运算符将其他属性和a属性分开来,这波操作很亮眼 !
const obj = {a: , b: , c: };
const {a, ...newObj} = obj;
console.log(newObj) // => {b: 2, c: 3};
五、两个Set对象相减
//利用filter对s1进行过滤 ,去掉s2中存在的数字
const s1 = [ , , , , ];
const s2 = [ , ];
const subtracted = s1.filter(x => s2.indexOf(x) < );
console.log(subtracted);//[1,3,5]
同理这样是可以去出一个数组中指定的元素
//去掉s3中的2和4
const s3 = [ , , , , , , , , , , ];
const s2 = [ , ];
const subtracted1 = s3.filter(x => s2.indexOf(x) < );
console.log(subtracted1); // [1, 3, 5, 5, 6]
六、判断一个单词是否是回文
//利用reverse 进行字符串反转,然后和原字符串对比是否相等
function isPalindrom(str) {
return str == str.split('').reverse().join('');
}
七、统计一个字符串出现最多的字母
//统计每个字母出现的次数,然后存起来,然后进行比较
function maxTimesChar(str) {
if(str.length == ) {
return str;
}
let charObj = {};
for(let i=;i<str.length;i++) {
if(!charObj[str.charAt(i)]) {
charObj[str.charAt(i)] = ;
}else{
charObj[str.charAt(i)] += ;
}
}
let maxChar = '',
maxValue = ;
for(var k in charObj) {
if(charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar; }
感觉这个方法不够装B,欢迎大神的你进行提供更厉害的方法。请在留言区约起来!
欢迎大家在留言区提供以上问题更优雅的解法,有不同意见或更好的思路欢迎指出,喜欢的话可以点个推荐或者关注( 楼主真不要脸,骗关注 !),最后祝大家国庆愉快!
注:本文出自博客园 https://home.cnblogs.com/u/mdengcc/ ,转载请注明出处。
JS 数据处理技巧及小算法汇总的更多相关文章
- JS 数据处理技巧及小算法汇总( 一)
前言: 金秋九月的最后一天,突然发现这个月博客啥也没更新,不写点什么总觉得这个月没啥长进,逆水行舟,不进则退,前进的路上贵在坚持,说好的每个月至少一到两篇,不能半途而废!好多知识写下来也能加深一下自身 ...
- 【js】中的小技巧
本文主要介绍一些JS中用到的小技巧 1. 类型强制转换 1.1 string强制转换为数字 可以用*1来转化为数字(实际上是调用.valueOf方法) 然后使用Number.isNaN来判断是否为 ...
- JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
本文实例总结了JS数组排序技巧.分享给大家供大家参考,具体如下: 1.冒泡排序 var temp = 0; for (var i = 0; i < array.length; i++) { fo ...
- JS、JQ相关小技巧积攒
JS.JQ相关小技巧积攒,以备不时之需. 1.js 获取时间差:时间戳相减.new Date().getTime() 获得毫秒数,除以(1000*60*60*24) 获得天数. 2.重定向操作:页面 ...
- 必备的JS调试技巧汇总
转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- Backbone.js的技巧和模式
Backbone.js的技巧和模式 Backbone.js的技巧和模式 本文由白牙根据Phillip Whisenhunt的<Backbone.js Tips And Patterns> ...
- 前端开发中的JS调试技巧
前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...
- PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键
PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键 1. 附加:工具栏不见了 调色板(Palette)快捷工具栏不见了PowerDesigner ...
随机推荐
- (后端)如何将数据库的表导出生成Excel?
1.如何通过元数据拿到数据库的信息? 2.如何用Java生成Excel表? 3.将数据库中的表导出生成Excel案例 如何通过元数据拿到数据库的信息 元数据:描述数据的数据 Java中使用元数据的两个 ...
- 使用wxpy自动发送微信消息(加强版)
通过使用wxpy自动发送微信消息后,笔者又加强了发送消息,堪称消息爆炸式发送 目前设置的为10秒发送一次,发送9次,每次发送10条内容 import requests import wxpy from ...
- python 3.3.2报错:No module named 'urllib2'
ModuleNotFoundError: No module named 'urllib3' 1. ImportError: No module named 'cookielib'1 Python3中 ...
- VS 函数,方法上方 引用等显示
VS有一个这个功能贼好用,喜欢的可以打开看看哦,特别是团队开发,有惊喜哦!
- const int *p 和int * const p 的区别
看例子: int sloth = 3; const int *p1 = &sloth; int * p2 const = &sloth; 这样申明的话,不允许使用p1来修改sloth的 ...
- windows 自动贴边
设置windows 自动贴边(窗口拖到显示器边框就自动适应屏幕): https://jingyan.baidu.com/article/d2b1d1029d17b95c7e37d4f0.html 资源 ...
- Spring boot+ maven + thymeleaf + HTML 实现简单的web项目
第一步: 创建一个SpringBoot应用 第二步: 创建一个实体,用来存储数据,在src/main/java/com/example/first下创建包entity , 在entity下创建Pers ...
- 面转栅格之ERROR 999999:执行函数时出错
今天进行矢量面转栅格的操作时,总是出现ERROR 999999:执行函数时出错,如下图所示: 刚开始以为是栅格保存的路径太长的问题,后来发现是矢量面的路径问题,我的矢量面是放在自建的图层组下面,如下图 ...
- hadoop系列 第三坑: Task process exit with nonzero status of 137
跑MR的时候抛出异常: java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.j ...
- yii2 支付宝支付教程 [ 2.0 版本 ]
yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层2.在订单处理层引用支付宝的接口 将支付数据写入 ...