为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 filter() 方法从 JavaScript 中的数组数组中获取不同的值?

如何使用 filter() 方法从 JavaScript 中的数组数组中获取不同的值?

慕田峪9158850 2021-09-17 12:32:08
我有一个这样的数组:let x = [[1, 2], [3, 4], [1, 2], [2, 1]];我应该怎么做才能检索没有重复项的数组?[[1, 2], [3, 4], [2, 1]];我想使用过滤器方法。我试过这个,但它不起作用:x.filter((value,index,self) => (self.indexOf(value) === index))编辑:正如我指定使用过滤器方法,我不认为这个问题是重复的。另外,我得到了几个有趣的答案。
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

尝试将内部数组转换为字符串,然后过滤重复项并再次解析字符串。


let x = [[1, 2], [3, 4], [1, 2]];


var unique = x.map(ar=>JSON.stringify(ar))

  .filter((itm, idx, arr) => arr.indexOf(itm) === idx)

  .map(str=>JSON.parse(str));


console.log(unique);


查看完整回答
反对 回复 2021-09-17
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

过滤器只会导致事情进入 O(n^2)。


当前接受的答案使用.filter((itm, idx, arr) => arr.indexOf(itm) === idx)这将导致每次迭代期间每次迭代数组...n^2。


为什么还要去那里?不仅如此,最后还需要解析。这是很多多余的。


这里没有真正的好方法来使用过滤器而不达到 O(n^2),所以如果性能是目标,则可能应该避免。


相反,只需使用reduce。它非常简单且快速轻松地完成 O(n)。


“将集合减少到唯一值。”


let x = [[1, 2], [3, 4], [1, 2], [2, 1]];

let y = Object.values(x.reduce((p,c) => (p[JSON.stringify(c)] = c,p),{}));

console.log(y);


如果不是很清楚,这里有一个更易读的 bin 减少版本。


// Sample Data

let dataset = [[1, 2], [3, 4], [1, 2], [2, 1]];


// Create a set of bins by iterating the dataset, which

// is an array of arrays, and structure the bins as

//     key: stringified version of the array

//     value: actual array

let bins = {};


// Iteration

for(let index = 0; index < dataset.length; index++){

 // The current array, from the array of arrays

 let currentArray = dataset[index];

 

 // The JSON stringified version of the current array

 let stringified = JSON.stringify(currentArray);

 

 // Use the stringified version of the array as the key in the bin,

 // and set that key's value as the current array

 bins[stringified] = currentArray;

}


// Since the bin keys will be unique, so will their associated values. 

// Discard the stringified keys, and only take the set of arrays to

// get the resulting unique set.

let results = Object.values(bins);


console.log(results);


如果您必须走过滤器的路线,则必须使用 n^2。您可以使用 each 迭代每个项目以寻找存在性。


“保留之前没有重复的每个元素。”


let x = [

  [1, 2],

  [3, 4],

  [1, 2],

  [2, 1]

];

let y = x.filter((lx, li) =>

  x.every((rx, ri) =>

    rx == lx ||

    (JSON.stringify(lx) != JSON.stringify(rx) || li < ri))

);

console.log(y);


查看完整回答
反对 回复 2021-09-17
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

好的,字符串哈希的想法很棒。道具到I wrestled a bear once. 我认为代码本身可能会更好一些,所以这是我倾向于做这种事情的方式:


let x = [[1, 2], [3, 4], [1, 2]];

const map = new Map();

x.forEach((item) => map.set(item.join(), item));

console.log(Array.from(map.values()));


如果你想要一个丑陋的内衬:


let x = [[1, 2], [3, 4], [1, 2]];

const noRepeats = Array.from((new Map(x.map((item) => [item.join(), item]))).values());

console.log(noRepeats);


查看完整回答
反对 回复 2021-09-17
  • 3 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信