js 数组去重小技巧

Intro

今天遇到一个问题,需要对数据进行去重,想看一下有没有什么比较方便的方法,果然有些收获。

Question

问题描述:

我有一个这样的数据:

[
{
"ProjectId": "94147992363ef910",
"ProjectName": "新梅太古城中粮天悦澜庭",
"ProjectAddress": "曲阜路966弄"
},
{
"ProjectId": "c5b6ce1988dd2af7",
"ProjectName": "新梅共和城",
"ProjectAddress": "广中西路99弄"
},
{
"ProjectId": "c5b6ce1988dd2af7",
"ProjectName": "新梅共和城",
"ProjectAddress": "广中西路99弄"
}
]

要实现根据 ProjectId 去重,应该得到下面的结果:

[
{
"ProjectId": "94147992363ef910",
"ProjectName": "新梅太古城中粮天悦澜庭",
"ProjectAddress": "曲阜路966弄"
},
{
"ProjectId": "c5b6ce1988dd2af7",
"ProjectName": "新梅共和城",
"ProjectAddress": "广中西路99弄"
}
]

先从一个简单的问题入手,将一个数组去重 [1, 2, 3, 3, 4]

Solution1

通常,我们一般都是这样去做的,将要用于去重的数据放在一个 集合 中,将去重的数据放到一个集合中(最终我们要的数据)

示例代码:

//
var arr = [1, 2, 3, 3, 4];
var result = new Array();
var filterArr = new Array(); for (var i = 0; i < info.length; i++) {
for (var k = 0; k < filterArr.length; k++) {
if (filterArr[i] == arr[i]) {
continue;
}
}
// 或者使用 indexOf 判断
//if (filterArr[i].indexOf(arr[i]) > -1) {
// continue;
//}
filterArr.push(arr[i]);
result.push(arr[i]);
} // filter
arr = arr.filter(function (value, index, array) {
return array.indexOf (value) == index;
});
// es6
arr = arr.filter( (value, index, array) => array.indexOf (value) == index);
//
var info = [
{
"ProjectId": "94147992363ef910",
"ProjectName": "新梅太古城中粮天悦澜庭",
"ProjectAddress": "曲阜路966弄"
},
{
"ProjectId": "c5b6ce1988dd2af7",
"ProjectName": "新梅共和城",
"ProjectAddress": "广中西路99弄"
}
]; function filter() {
var filterArr = [];
var result = [];
for (var i = 0; i < info.length; i++) {
for (var k = 0; k < filterArr.length; k++) {
if (filterArr[i] == info[i].ProjectId) {
continue;
}
}
filterArr.push(info[i].ProjectId);
result.push(info[i]);
}
return result;
}

Solution2

ES6 里提供了 Set 的新语法,Set里不会有重复的元素,简单数组去重用它来实现最简单不过了,举个栗子:

var arr = [1, 2, 3, 3, 4];
console.log(arr); // [1, 2, 3, 3, 4] arr = Array.from(new Set(arr));
console.log(arr);// [1, 2, 3, 4] //
info = info.filter((s => a => !s.has(a.ProjectId) && s.add(a.ProjectId))(new Set));

End

是不是 es6 更方便、更简洁,还没用es6的童鞋强烈建议使用,

上的一坨代码用 es6 只需要一行,只需要一行,只需要一行

info = info.filter((s => a => !s.has(a.ProjectId) && s.add(a.ProjectId))(new Set));

希望你能有所收获

js 数组去重小技巧的更多相关文章

  1. JS数组去重的6种算法实现

    1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...

  2. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  3. JS 数组去重(数组元素是对象的情况)

    js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...

  4. js数组去重常用方法

    js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...

  5. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  6. js数组去重五种方法

    今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和自己总结的,总共5种方法(ES5). 第一种:遍历数组法 这种方法最简单最直观,也最容易理解,代码如下: var arr = [2, 8, 5, ...

  7. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. js 数组去重方法汇总

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. js数组去重 javascript版

    //js数组去重 //思路: // 1.放入第一个元素 // 2.放入第n个元素,和第n个之前的元素就行比较,如果有重复,则跳过.没有重复就加入数组中 // 3.返回新的去重后数组 Array.pro ...

随机推荐

  1. [Swift]LeetCode741. 摘樱桃 | Cherry Pickup

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  2. [Swift]LeetCode919. 完全二叉树插入器 | Complete Binary Tree Inserter

    A complete binary tree is a binary tree in which every level, except possibly the last, is completel ...

  3. 陕西省网络空间安全技术大赛部分题目writeup

    签到-欢迎来到CSTC2017 10 欢迎来到CSTC2017 ZmxhZ3tXZWlTdW9GeXVfQmllTGFuZ30= Base64解密:flag{WeiSuoFyu_BieLang} 种棵 ...

  4. github pages代码高亮highlighter

    github pages 一直想添加代码高亮 highlighter ,基于 jekyll 3.0 的 rouge 终于搞定了: 下载代码高亮库 在 cmd 中输入: rougify style mo ...

  5. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  6. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

  7. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  8. docker-compose部署mysql无法访问

    docker-compose部署mysql无法访问 这个问题困扰了我很久,当使用docker-compose部署mysql之后,进行容器后,使用mysql -u root -p 是可以访问的,而使用s ...

  9. UGUI 中Dropdown控件的使用经验

    UGUI 中Dropdown控件的使用经验 在Untiy的UGUI 刚出来的时候,是没有“下拉列表”(Dropdown)控件的,这在无形中给我们的UI界面开发带来困难,不过在Untiy5.2.2之后这 ...

  10. [五]基础数据类型之Short详解

      Short 基本数据类型short  的包装类 Short 类型的对象包含一个 short 类型的字段      原文地址:[五]基础数据类型之Short详解   属性简介   值为  215-1 ...