es6中如何根据对象的id返回唯一对象的数组?

问题描述 投票:0回答:5
    Array(96) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
​
0: Object { id: 1, name: "PrimShal01", period: 3, … }
1: Object { id: 61, name: "TertDeep01", period: 1, … }
2: Object { id: 37, name: "SecoDeep01", period: 2, … }
3: Object { id: 49, name: "TertShal01", period: 1, … } ​
4: Object { id: 13, name: "PrimDeep01", period: 3, … }
5: Object { id: 61, name: "TertDeep01", period: 1, … }

当我尝试以下代码时,我只获得唯一的 id,但我想要对象:

const uniques = [new Set(all_filter_ids.map(pos => pos.id))]

当我尝试以下代码时,我得到的结果与以前相同:

const uniques = [new Set(all_filter_ids)]
javascript arrays object ecmascript-6 unique
5个回答
7
投票

将它们转为按 ID 索引的 Map(一个键只能存在一个对象),然后将 Map 的值转回数组。

const map = new Map(all_filter_ids.map(pos => [pos.id, pos]));
const uniques = [...map.values()];

6
投票

另一种解决方案:

const arr = [{ id: 1, name: "PrimShal01", period: 3},{ id: 61, name: "TertDeep01", period: 1},{ id: 37, name: "SecoDeep01", period: 2},{ id: 49, name: "TertShal01", period: 1},{ id: 13, name: "PrimDeep01", period: 3},{ id: 61, name: "TertDeep01", period: 1}]

const result = Object.values(
    arr.reduce((acc, obj) => ({ ...acc, [obj.id]: obj }), {})
);

console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}


2
投票

维护

set
用于跟踪 ID 并使用
filter

const uniq = (arr, track = new Set()) =>
  arr.filter(({ id }) => (track.has(id) ? false : track.add(id)));

const arr = [
  { id: 1, name: "PrimShal01", period: 3 },
  { id: 61, name: "TertDeep01", period: 1 },
  { id: 37, name: "SecoDeep01", period: 2 },
  { id: 49, name: "TertShal01", period: 1 },
  { id: 13, name: "PrimDeep01", period: 3 },
  { id: 61, name: "TertDeep01", period: 1 },
];

console.log(uniq(arr))


2
投票

您可以使用map从数组中获取不同的对象。

filter(Boolean)
是去除数组中的所有空值。

const array = [
  { id: 1, name: "PrimShal01", period: 3},
  { id: 61, name: "TertDeep01", period: 1},
  { id: 37, name: "SecoDeep01", period: 2},
  { id: 49, name: "TertShal01", period: 1},
  { id: 13, name: "PrimDeep01", period: 3},
  { id: 61, name: "TertDeep01", period: 1}
]

const uniqueByKey = (array = [], key = '') => {
  if (!key) {
    return array;
  }

  return [
    ...new Map(
      array
        .filter(Boolean)
        .map((item) => [item[key], item]),
    ).values(),
  ];
};

console.log(uniqueByKey(array, 'id'));


0
投票

您可以尝试使用纯JavaScript来实现删除数组中重复项的功能。

const array = [
  { id: 1, name: "PrimShal01", period: 3},
  { id: 61, name: "TertDeep01", period: 1},
  { id: 37, name: "SecoDeep01", period: 2},
  { id: 49, name: "TertShal01", period: 1},
  { id: 13, name: "PrimDeep01", period: 3},
  { id: 61, name: "TertDeep01", period: 1}
];

const uniqueByKey = (array = [], key = '') => {
  if (!key) {
    return array;
  }

  const map = {};
  const result = [];

  for (const item of array) {
    if (!map[item[key]]) {
      result.push(item);
      map[item[key]] = true;
    }
  }

  return result;
};

console.log( uniqueByKey (array, 'id'));

© www.soinside.com 2019 - 2024. All rights reserved.