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

时间:2018-02-07 13:46:41

标签: javascript arrays filter ecmascript-6

我在Javascript中有一个对象数组

我正在尝试按对象值

过滤掉重复项
  1. 获取重复

  2. 获得独特

  3. 示例数组:

    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'
    }];
    

2 个答案:

答案 0 :(得分:1)

您可以为同一type_idMap并收集对象,然后根据数组的长度将映射的项目推送到唯一或欺骗。

该行

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

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

                 [unique, dupes]                                 // targets

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

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

Cosider此列表用于获取索引,0表示唯一项目,1表示重复项目。零长度不存在,因为如果制作了地图条目,则长度为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

然后使用spread syntax ...,数组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; }

答案 1 :(得分: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/

希望这有帮助! :)

最好的问候