javascript:如果在特定索引中发现重复值,是否有从数组中删除项的函数?

wfsdck30  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(364)

我有一个包含三列的数组:

[ '27', 'Name', '1' ],
[ '27', 'Name', '1' ],
[ '27', 'Name', '1' ],
[ '27', 'Name', '2' ]

我正在尝试删除第三列中有重复项的项目,以便获得:

[ '27', 'Name', '2' ]

我正在使用以下代码:

function getUniqueListBy(arr, key) {
    return [...new Map(arr.map(item => [item[key], item])).values()]
  }

let newArray = getUniqueListBy(myArr, '2');

它在删除重复项方面做得非常好,但我也希望删除该项(已复制的项)。如果可能的话,我希望代码尽可能高效。我该怎么做?

vom3gejh

vom3gejh1#

Map:您可以在索引处创建元素的Map 2 并将值存储为 index 在该索引处包含相同值的。
它是一个元素字典,同时包含相同的元素 2 指数
过滤器:过滤结果并在字典中查找位于 2 索引的数组长度应为 1 ```
const arr = [
["27", "Name", "1"],
["27", "Name", "1"],
["27", "Name", "1"],
["27", "Name", "2"],
];

// [ '27', 'Name', '2' ]
const map = new Map();

// na is nestedArray
arr.forEach((na, i) => {
const value = na[2];
if (map.has(value)) map.get(value).push(i);
else map.set(value, [i]);
});

const result = arr.filter((na, i) => map.get(na[2]).length === 1);
console.log(result);

vojdkbi0

vojdkbi02#

如果您将子阵列串接(这便于与 ===Set#has ),您可以使用两个集合轻松识别哪些项是重复项,以便将其删除。

const arr = [
[ '27', 'Name', '1' ],
[ '27', 'Name', '1' ],
[ '27', 'Name', '1' ],
[ '27', 'Name', '2' ]
];
const found = new Set();
const dupes = new Set();
for (const subarr of arr) {
  const str = JSON.stringify(subarr);
  if (found.has(str)) dupes.add(str);
  else found.add(str);
}
const result = [...found]
  .filter(str => !dupes.has(str))
  .map(JSON.parse);
console.log(result);

相关问题