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数组去重(包括对象数组去重)相关推荐

  1. js for in遍历对象_JS中轻松遍历对象属性的几种方式

    自身可枚举属性 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都 ...

  2. js 去重某个键值 数组对象_JS数组去重常见方法分析

    数组去重是开发中经常会遇到的问题,也是面试时经常会考到的.JS实现数组去重可以有多种方法: 一.简单的去重方法 用一个类比来简单解释一下这种去重方法的思路:A篮子里有若干个不同颜色和大小的球,旁边放一 ...

  3. js里存储键值对以及注意事项

    前端有时候需要存储键值对,需要主要的一点是键必须为字符串,重要的再次说明,键需要为字符串.重点内容 <!DOCTYPE html> <html> <head> &l ...

  4. PHP将一个二维数组按照某个键的键值做出重组一个新的二维数组

    如下一个二维数组,将一个二维数组按照apname的 键值来排序组合成一个新的二维数组  apname 键值不变,其中其他几个红色划线部分进行组合. 构建好之后展现效果如下 使用了两种方式进行构建 方法 ...

  5. vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件

    昔登铜井望法华,葱茏螺黛浮蒹葭.今登法华望铜井,湖水迷茫烟色瞑.-- <登法华寺山顶> Proxy是什么 Proxy是JS标准内置对象中的一个对象.用于创建一个对象的代理.从而实现对对象操 ...

  6. js利用tab键切换当前页面_JS实现的tab切换并显示相应内容模块功能示例

    本文实例讲述了JS实现的tab切换并显示相应内容模块功能.分享给大家供大家参考,具体如下: 思路:一层循环遍历操作的元素并获取当前遍历到的元素的下标,通过下标去选择显示对应的内容模块. 二层循环将元素 ...

  7. js利用tab键切换当前页面_js小技巧:tab页切换

    依旧只是贴在这里备份,方便以后粘贴复制,高手绕过,以免浪费时间:) tab页切换 function switchTab(ProTag, ProBox) { for (i = 1; i < 5; ...

  8. sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。

    P5546 [POI2000]公共串 所有串合在一起,每两个串放不同的字符,求一遍后缀数组,然后利用height数组求LCS即可. #include<iostream> #include& ...

  9. es6 对象中是否有键值_js/es6判断对象是否为空,并判断对象是否包含某个属性...

    js判断对象为空以及有好几种方法了,但是个人觉得不是特别方便. 比如: 1.把对象通过 JSON.stringify 转为字符串,再判断字符串是否等于 " {} " 2.for i ...

最新文章

  1. Elasticsearch 6.3.1、Head插件 安装及配置
  2. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
  3. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
  4. 汉字转拼音php代码函数,php中将汉字转换成拼音的函数代码
  5. kibana操作elasticsearch:新增数据(自定义id)
  6. android 如何使用服务器进行版本更新
  7. java 数据库连接池
  8. 在线编写php文件,php单文件版在线代码编辑器_php实例
  9. 兰州交通大学计算机科学与技术学院,兰州交通大学计算机科学与技术
  10. 20180802总结
  11. 改变变压器联接方式可消除某些特定次数的谐波_电工牛人10年经验,总结的4电工常用接线方法41例,电机、变压器、接触器..都有...
  12. android学习笔记---50_样式与主题,给控件使用样式,给应用使用主题
  13. LINUX下类似画图板Paint的工具
  14. RTSP视频流开发经验总结
  15. 犀牛keyshot插件_keyshot 对接 犀牛各版本插件集合
  16. 文章原创率只有40%?修改方法来了
  17. Google如何对图片搜索结果进行排名
  18. c/c++进制转换方法汇总(含全部代码)
  19. FeignClient方式调用第三方接口
  20. Matlab 绘图函数之plot、semilogx、semilogy、loglog函数的使用

热门文章

  1. 企业级正规php第三方api,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等...
  2. tf14: 黑白图像上色
  3. ELK 系列九、elasticsearch扩容(从单机至单机伪集群)
  4. php 正则匹配11位数字,php正则匹配数字
  5. 数控系统CNC机床解密
  6. 网站根据不同时间段php输出不同的问候语
  7. 异常的定义及其相关处理
  8. 打击犯罪(black)
  9. 《Android开源库 ~ 1》 GitHub Android Libraries Top 100 简介
  10. 学生分组和选题【硬件课程设计】