这种数组如何去重?

var datas = [
         {name: "北海国发海洋生物产业股份有限公司"},
         {name: "贵州长征电气股份有限公司"},
         {name: "北海银河开关设备有限公司"},
         {name: "北海银河开关设备有限公司"},
     ];

结果是

var datas = [
         {name: "北海国发海洋生物产业股份有限公司"},
         {name: "贵州长征电气股份有限公司"},
         {name: "北海银河开关设备有限公司"},
     ];

请问如何写,可以用underscore插件

阅读 4.9k
8 个回答

underscore

_.uniq(datas, 'name')

lodash

_.uniqBy(datas, 'name')
var datas = [
 {name: "北海国发海洋生物产业股份有限公司"},
 {name: "贵州长征电气股份有限公司"},
 {name: "北海银河开关设备有限公司"},
 {name: "北海银河开关设备有限公司"},
];
const unique = function(data){
 let res = [];
 let json = {};
 for(var i = 0; i < data.length; i++){
  if(!json[data[i].name]){
   res.push(data[i]);
   json[data[i].name] = 1;
  }
 }
 return res;
}
unique(datas)
datas.map(v => JSON.stringify(v)).filter((v, i, arr) => arr.indexOf(v) === i).map(v=>JSON.parse(v))

或者

[...new Set(datas.map(v => JSON.stringify(v)))].map(v=>JSON.parse(v))

借助set的特性 去重...

var datas = [
         {name: "北海国发海洋生物产业股份有限公司"},
         {name: "贵州长征电气股份有限公司"},
         {name: "北海银河开关设备有限公司"},
         {name: "北海银河开关设备有限公司"},
     ];
//净化成数组
let arr=[];
for(let val in datas){
    arr.push(datas[val].name);
}
//去重
let set = new Set(arr);
//转回成数组
Array.of(set);
console.log(set);//["北海国发海洋生物产业股份有限公司", "贵州长征电气股份有限公司", "北海银河开关设备有限公司"];
     

加id通过id判断

_.uniq(datas, true, item => {
    return item.name
  })

lodash倒是有一个这样的方法.underscore里uniq也可以的

lodash里的例子:
// The `_.property` iteratee shorthand.
_.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }, { 'x': 2 }]

Lodash

_.uniqBy(data, 'name');

Map

const map = new Map();
data.forEach(item => map.set(item.name, item));
const uniqData = [...map.values()];
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题