首页 > 解决方案 > 在对象数组中选择唯一项

问题描述

假设我有以下对象数组

[{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}]

如何选择此数组中的唯一项目。我需要比较两个字段(仅 a、b,不包括 c),并且我看到的示例显示了一个仅采用单个字段的地图。

标签: javascriptunique

解决方案


a您可以使用嵌套过滤器,并检查具有相同和的匹配元素的数量b为 1:

const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const output = input.filter(
  ({ a, b }) => input.filter(obj => obj.a === a && obj.b === b).length === 1
);
console.log(output);

相反,为了O(N)复杂性,减少到一个由 索引的对象num_num,或类似的东西,然后只选择其中包含一个项目的值:

const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const inputByAB = input.reduce((accum, obj) => {
  const key = `${obj.a}_${obj.b}`;
  if (!accum[key]) {
    accum[key] = [];
  }
  accum[key].push(obj);
  return accum;
}, {});
const output = Object.values(inputByAB)
  .filter(arr => arr.length === 1)
  .flat();
console.log(output);

如果您不能使用.flat,请改为使用 concat :

const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const inputByAB = input.reduce((accum, obj) => {
  const key = `${obj.a}_${obj.b}`;
  if (!accum[key]) {
    accum[key] = [];
  }
  accum[key].push(obj);
  return accum;
}, {});
const output = [].concat(...
  Object.values(inputByAB)
    .filter(arr => arr.length === 1)
);
console.log(output);


推荐阅读