我刚刚学习了一个新技巧,可以在2个数组对象中找到相同的对象,它工作得很好。它使用array.filter和array.some,如下所示,但是我不明白当filter()
返回true或false时some()
会如何运行。
const similarity = (arr, values) => arr.filter(item => values.some(m => (m.id === item.id) && (m.name === item.name)));
我的输入:
let arr1 = [
{
id: 1,
name: "kiet"
},
{
id: 2,
name: 'phan'
},
{
id: 3,
name: 'tuan'
}]
let arr2 = [
{
id: 1,
name: "kiet"
},
{
id: 2,
name: 'haha'
},
{
id: 5,
name: 'tuan'
}
]
我的结果:
[ { id: 1, name: 'kiet' } ]
答案 0 :(得分:1)
您从数组中获得了与值数组具有相同属性id
/ name
的元素。
Array#filter
需要一个(某种)布尔值,如果是true
或truthy,则该项目将被带到新数组中。
Array#some
检查一个项目,如果回调返回 truthy 值,则返回true
,否则返回false
。
const
similarity = (array, values) => array.filter(item => values.some(m => m.id === item.id && m.name === item.name)),
arr1 = [ { id: 1, name: "kiet" }, { id: 2, name: 'phan' }, { id: 3, name: 'tuan' }],
arr2 = [ { id: 1, name: "kiet" }, { id: 2, name: 'haha' }, { id: 5, name: 'tuan' }],
result = similarity(arr1, arr2);
console.log(result);
对于较大的数据集,您可以使用Set
,它会使用一个组合值进行一次迭代,并针对过滤进行检查。
const
similarity = (array, values) => {
const
getKey = ({ id, name }) => [id, name].join('|'),
keys = new Set(values.map(getKey));
return array.filter(o => keys.has(getKey(o)));
},
arr1 = [ { id: 1, name: "kiet" }, { id: 2, name: 'phan' }, { id: 3, name: 'tuan' }],
arr2 = [ { id: 1, name: "kiet" }, { id: 2, name: 'haha' }, { id: 5, name: 'tuan' }],
result = similarity(arr1, arr2);
console.log(result);
答案 1 :(得分:0)
您正在过滤数组,然后在some
(m.id === item.id) && (m.name === item.name)
如果第二个数组的ID(此处,m
是第二个数组的对象)等于第一个数组的ID(此处,item
是该数组的对象),并且名称等于第一个数组的name属性。如果是,则它将返回true。因此,filter
为true,如果为true,它将返回其为true的特定对象
let arr1 = [{ id: 1, name: "kiet" }, { id: 2, name: 'phan' }, { id: 3, name: 'tuan'}]
let arr2 = [ { id: 1, name: "kiet" }, { id: 2, name: 'haha' }, { id: 5, name: 'tuan' } ]
const similarity = (arr, values) => arr.filter(item => values.some(m => (m.id === item.id) && (m.name === item.name)));
console.log(similarity(arr1,arr2))
答案 2 :(得分:-4)
如果要检查数组的交集,这是个好方法。
const vowels = [...'AEIOU'];
const isVowel = x => vowels.some(v => v === x);
const hasVowel = string => [...string].filter(isVowel).length > 0;