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

我有一个这样的数组:

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))

编辑:正如我指定使用过滤器方法,我不认为这个问题是重复的。另外,我得到了几个有趣的答案。


慕田峪9158850
浏览 249回答 3
3回答

幕布斯7119047

尝试将内部数组转换为字符串,然后过滤重复项并再次解析字符串。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);

白猪掌柜的

过滤器只会导致事情进入 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 Datalet 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//&nbsp; &nbsp; &nbsp;key: stringified version of the array//&nbsp; &nbsp; &nbsp;value: actual arraylet bins = {};// Iterationfor(let index = 0; index < dataset.length; index++){&nbsp;// The current array, from the array of arrays&nbsp;let currentArray = dataset[index];&nbsp;&nbsp;// The JSON stringified version of the current array&nbsp;let stringified = JSON.stringify(currentArray);&nbsp;&nbsp;// Use the stringified version of the array as the key in the bin,&nbsp;// and set that key's value as the current array&nbsp;bins[stringified] = currentArray;}// Since the bin keys will be unique, so will their associated values.&nbsp;// 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 = [&nbsp; [1, 2],&nbsp; [3, 4],&nbsp; [1, 2],&nbsp; [2, 1]];let y = x.filter((lx, li) =>&nbsp; x.every((rx, ri) =>&nbsp; &nbsp; rx == lx ||&nbsp; &nbsp; (JSON.stringify(lx) != JSON.stringify(rx) || li < ri)));console.log(y);

胡说叔叔

好的,字符串哈希的想法很棒。道具到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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript