js 去重某个键值 数组对象_js数组去重(包括对象数组去重)
2019.08.02补:
对象数组建议直接循环然后使用工具库(lodash)的深比较,评论里也有指出,文章的方法有些取巧了 生产环境不要这么玩~。
方法一:利用ES6的Array.from()/扩展运算符 以及 Set
Array.from(): The Array.from() method creates a new Array instance from an array-like or iterable object.
该方法接收两个参数要转换的非数组对象,对每个元素进行处理的方法(可选).在js中,有很多类数组对象(array-like object)和可遍历(iterable)对象(包括ES6新增的数据结构Set和Map),常见的类数组对象包括document.querySelectorAll()取到的NodeList,以及函数内部的arguments对象。它们都可以通过Array.from()转换为真正的数组,从而使用数组的方法。事实上只要对象具有length属性,就可以通过Array.from()转换为真正的数组。
Set:A collection of unique values that may be of any type.
Set:一个可以是任何类型的独一无二的值的集合.
function unique(arr){
return Array.from(new Set(arr));
}
你也可以这样写:
function unique(arr){
return [...new Set(arr)];
}
方法二:遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组
Determines the index of the specific IThing in the list.
indexOf() :方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有则返回-1
function unique(arr){
var newArr = [];
for(var i in arr) {
if(newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i])
}
}
return newArr;
}
方法三:遍历数组,利用object对象的key值保存数组值(key不重复),判断数组值是否已经保存在object中,未保存则push到新数组并用object[arrayItem]=true的方式记录保存.
function unique(arr) {
let hashTable = {};
let newArr = [];
for(let i=0,l=arr.length;i
if(!hashTable[arr[i]]) {
hashTable[arr[i]] = true;
newArr.push(arr[i]);
}
}
return newArr;
}
方法四:先排序,新数组最后一项为旧数组第一项,每次插入判断新数组最后一项是否与插入项相等
function unique(arr) {
var newArr = [];
var end; //end其实就是一道卡
arr.sort();
end = arr[0];
newArr.push(arr[0]);
for (var i = 1; i < arr.length; i++) {
if (arr[i] != end) {
newArr.push(arr[i]);
end = arr[i]; //更新end
}
}
return newArr;
}
以上四种方法都是对于基本数据类型而言,如果换做对象数组就无能为力了,下面是对象数组的去重方法
方法一:利用对象的键名不能重复的特点
function unique(arr){
let unique = {};
arr.forEach(function(item){
unique[JSON.stringify(item)]=item;//键名不会重复
})
arr = Object.keys(unique).map(function(u){
//Object.keys()返回对象的所有键值组成的数组,map方法是一个遍历方法,返回遍历结果组成的数组.将unique对象的键名还原成对象数组
return JSON.parse(u);
})
return arr;
}
map方法使用示例:
var map = Array.prototype.map
var a = map.call("Hello World", function(x) { return x.charCodeAt(0); })
// a的值为[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
存在的问题:
{x:1,y:2}与{y:2,x:1}通过JSON.stringify字符串化值不同,但显然他们是重复的对象.
方法二:还是利用对象的键名无法重复的特点,必须知道至少一个对象数组中的对象的属性名
var songs = [
{name:"羽根",artist:"air"},
{name:"羽根",artist:"air"},
{name:"晴天",artist:"周杰伦"},
{name:"晴天",artist:"周杰伦"},
{artist:"周杰伦",name:"晴天"}
];
function unique(songs){
let result = {};
let finalResult=[];
for(let i=0;i
result[songs[i].name]=songs[i];
//因为songs[i].name不能重复,达到去重效果,且这里必须知晓"name"或是其他键名
}
//console.log(result);{"羽根":{name:"羽根",artist:"air"},"晴天":{name:"晴天",artist:"周杰伦"}}
//现在result内部都是不重复的对象了,只需要将其键值取出来转为数组即可
for(item in result){
finalResult.push(result[item]);
}
//console.log(finalResult);[{name:"羽根",artist:"air"},{name:"晴天",artist:"周杰伦"}]
return finalResult;
}
console.log(unique(songs));
原数组(重复).png
result.png
finalResult.png
js 去重某个键值 数组对象_js数组去重(包括对象数组去重)相关推荐
- js for in遍历对象_JS中轻松遍历对象属性的几种方式
自身可枚举属性 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都 ...
- js 去重某个键值 数组对象_JS数组去重常见方法分析
数组去重是开发中经常会遇到的问题,也是面试时经常会考到的.JS实现数组去重可以有多种方法: 一.简单的去重方法 用一个类比来简单解释一下这种去重方法的思路:A篮子里有若干个不同颜色和大小的球,旁边放一 ...
- js里存储键值对以及注意事项
前端有时候需要存储键值对,需要主要的一点是键必须为字符串,重要的再次说明,键需要为字符串.重点内容 <!DOCTYPE html> <html> <head> &l ...
- PHP将一个二维数组按照某个键的键值做出重组一个新的二维数组
如下一个二维数组,将一个二维数组按照apname的 键值来排序组合成一个新的二维数组 apname 键值不变,其中其他几个红色划线部分进行组合. 构建好之后展现效果如下 使用了两种方式进行构建 方法 ...
- vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件
昔登铜井望法华,葱茏螺黛浮蒹葭.今登法华望铜井,湖水迷茫烟色瞑.-- <登法华寺山顶> Proxy是什么 Proxy是JS标准内置对象中的一个对象.用于创建一个对象的代理.从而实现对对象操 ...
- js利用tab键切换当前页面_JS实现的tab切换并显示相应内容模块功能示例
本文实例讲述了JS实现的tab切换并显示相应内容模块功能.分享给大家供大家参考,具体如下: 思路:一层循环遍历操作的元素并获取当前遍历到的元素的下标,通过下标去选择显示对应的内容模块. 二层循环将元素 ...
- js利用tab键切换当前页面_js小技巧:tab页切换
依旧只是贴在这里备份,方便以后粘贴复制,高手绕过,以免浪费时间:) tab页切换 function switchTab(ProTag, ProBox) { for (i = 1; i < 5; ...
- sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。
P5546 [POI2000]公共串 所有串合在一起,每两个串放不同的字符,求一遍后缀数组,然后利用height数组求LCS即可. #include<iostream> #include& ...
- es6 对象中是否有键值_js/es6判断对象是否为空,并判断对象是否包含某个属性...
js判断对象为空以及有好几种方法了,但是个人觉得不是特别方便. 比如: 1.把对象通过 JSON.stringify 转为字符串,再判断字符串是否等于 " {} " 2.for i ...
最新文章
- Elasticsearch 6.3.1、Head插件 安装及配置
- P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
- 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
- 汉字转拼音php代码函数,php中将汉字转换成拼音的函数代码
- kibana操作elasticsearch:新增数据(自定义id)
- android 如何使用服务器进行版本更新
- java 数据库连接池
- 在线编写php文件,php单文件版在线代码编辑器_php实例
- 兰州交通大学计算机科学与技术学院,兰州交通大学计算机科学与技术
- 20180802总结
- 改变变压器联接方式可消除某些特定次数的谐波_电工牛人10年经验,总结的4电工常用接线方法41例,电机、变压器、接触器..都有...
- android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题
- LINUX下类似画图板Paint的工具
- RTSP视频流开发经验总结
- 犀牛keyshot插件_keyshot 对接 犀牛各版本插件集合
- 文章原创率只有40%?修改方法来了
- Google如何对图片搜索结果进行排名
- c/c++进制转换方法汇总(含全部代码)
- FeignClient方式调用第三方接口
- Matlab 绘图函数之plot、semilogx、semilogy、loglog函数的使用
热门文章
- 企业级正规php第三方api,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等...
- tf14: 黑白图像上色
- ELK 系列九、elasticsearch扩容(从单机至单机伪集群)
- php 正则匹配11位数字,php正则匹配数字
- 数控系统CNC机床解密
- 网站根据不同时间段php输出不同的问候语
- 异常的定义及其相关处理
- 打击犯罪(black)
- 《Android开源库 ~ 1》 GitHub Android Libraries Top 100 简介
- 学生分组和选题【硬件课程设计】