我看过其他与此类似的问题,但没有找到与我要尝试的答案相符的答案。
我有一个多维数组:
var arr = [
["apple","ghana",15],
["apple","brazil",16],
["orange","nigeria",10],
["banana","ghana",6]
]
我只通过查看包含水果名称的第一列并返回唯一值数组来过滤数组。因此它将如下所示:
var uniqueArr = [
["apple","ghana",15],
["orange","nigeria",10],
["banana","ghana",6]
]
我想提供执行此操作的功能。我已经尝试过:
function isUnique (rows,index,self) {
return self.indexOf(rows) === index
}
但是它没有用。任何帮助,将不胜感激!
使用第1列(索引0)作为键将数组简化为对象,然后使用Object.values()
转换回数组:
const arr = [["apple","ghana",15],["apple","brazil",16],["orange","nigeria",10],["banana","ghana",6]]
const result = Object.values(
arr.reduce((r, a) => {
if(!r[a[0]]) r[a[0]] = a // add the item to the object, if the property doesn't exist yet
return r
}, {})
)
console.log(result)
您可以使用Set
并通过检查值是否存在来过滤数组。
如果存在则拒绝该元素。
如果不是,则将值添加到集合中并采用元素。
Set
var array = [["apple", "ghana", 15], ["apple", "brazil", 16], ["orange", "nigeria", 10], ["banana", "ghana", 6]],
seen = new Set,
result = array.filter(([value]) => !seen.has(value) && seen.add(value));
console.log(result);
尝试此
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用const filtered = arr.filter((row, index) => arr.findIndex(row2 => row2[0] === row[0]) >= index);
获得结果。
reduce