当我在数组过滤器中运行array.some时会发生什么

时间:2019-07-03 19:32:17

标签: javascript

我刚刚学习了一个新技巧,可以在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' } ]

3 个答案:

答案 0 :(得分:1)

您从数组中获得了与值数组具有相同属性id / name的元素。

Array#filter需要一个(某种)布尔值,如果是truetruthy,则该项目将被带到新数组中。

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;