繁体   English   中英

javascript数组按对象键过滤重复项

[英]javascript array filter duplicates by object key

我在 Javascript 中有一个对象数组

我正在尝试按对象值过滤掉重复项

  1. 得到重复

  2. 变得独一无二

示例数组:

let array = [
{ 
    id: '001',
    name: 'aaa',
    type_id: 'a111'
},{ 
    id: '002',
    name: 'bbb',
    type_id: 'a111'
},{
    id: '003',
    name: 'ccc',
    type_id: 'a222'
},{
    id: '004',
    name: 'ddd',
    type_id: 'a333'
}];

这就是我希望我的数组变成这样的:

function 1(array, 'type_id')
[{ 
    id: '001',
    name: 'aaa',
    type_id: 'a111'
},{ 
    id: '002',
    name: 'bbb',
    type_id: 'a111'
}];

function 2(array, 'type_id')
[{ 
    id: '003',
    name: 'ccc',
    type_id: 'a222'
},{ 
    id: '004',
    name: 'ddd',
    type_id: 'a333'
}];

您可以为相同的type_id获取一个Map并收集对象,然后根据数组的长度将映射的项目推送到 unique 或 dupes。

线

map.forEach(a => [unique, dupes][a.length - 1 && 1].push(...a));

获取地图并迭代它的所有元素并使用uniquedupes的目标数组,

                 [unique, dupes]                                 // targets

获取映射数组的长度,用于分离目标数组

                                [a.length - 1 && 1]              // select target

考虑此列表以获取索引, 0表示唯一项目, 1表示重复项目。 零长度不存在,因为如果创建映射条目,则长度为一。

 length length - 1 length - 1 && 1 comment ------ ---------- --------------- -------- 1 0 0 take `length - 1`, because of falsy 1st operand 2 1 1 take 2nd operand 3 2 1 take 2nd operand 4 3 1 take 2nd operand for all other greater length

然后使用扩展语法... ,数组a所有项目都用作Array#push参数。

                                                   .push(...a)   // push all itmes of array

 var array = [{ id: '001', name: 'aaa', type_id: 'a111' }, { id: '002', name: 'bbb', type_id: 'a111' }, { id: '003', name: 'ccc', type_id: 'a222' }, { id: '004', name: 'ddd', type_id: 'a333' }], key = 'type_id', map = new Map, unique = [], dupes = []; array.forEach(o => map.set(o[key], (map.get(o[key]) || []).concat(o))); map.forEach(a => [unique, dupes][a.length - 1 && 1].push(...a)); console.log(unique); console.log(dupes);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

我已经编写了一些代码来完成您想要实现的那些事情:

let array = [{
  id: '001',
  name: 'aaa',
  type_id: 'a111'
}, {
  id: '002',
  name: 'bbb',
  type_id: 'a111'
}, {
  id: '003',
  name: 'ccc',
  type_id: 'a222'
}, {
  id: '004',
  name: 'ddd',
  type_id: 'a333'
}];

var duplicates = [];
var uniques = [];
var valueCounts = {};


function getDuplicatesAndUniques(array, value) {
  for (var i = 0; i < array.length; i++) {
    if (!valueCounts[array[i][value]])
      valueCounts[array[i][value]] = 1;
    else
      valueCounts[array[i][value]]++;
  }

  for (var i = 0; i < array.length; i++) {
    if (valueCounts[array[i][value]] == 1) {
      uniques.push(array[i]);
    } else {
      duplicates.push(array[i]);
    }
  }

}

getDuplicatesAndUniques(array, "type_id");

console.log(duplicates);
console.log(uniques);

https://jsfiddle.net/hbpx08xh/1/

希望这可以帮助! :)

此致

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM