如何检查数组是否包含另一个对象的值?

问题描述

我正在尝试创建一个在对象值中存在所有数组值的情况下返回true的函数

我已经将对象值转换成名为newArray的新数组;但是我的问题是如何在给定数组和新数组之间进行比较?

const compare = function (array,object) {
    const newArray =Object.values(object)
    //compare here and return true/false
};  

compare(["one","two","three"],{ 0: "one",1: "two",2: "three" }); // => true
compare(["one","four"],2: "three" }); // => false

解决方法

我将对象值转换为新数组

我认为Set会更好,因为它具有https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types且具有亚线性性能,并且语义清晰明了。但是到达Set的最简单方法是通过数组,所以...:-)

一旦有了Set,就成为循环问题,在这种情况下,可能是has method

const compare = (array,object) => {
    const values = new Set(Object.values(object));
    return array.every(v => values.has(v));
};

every如果回调始终返回真实值,则返回true,或者在回调第一次返回虚假值时返回false(此时短路,没有理由继续寻找答案是否是“否”。

但是,如果要坚持使用数组,则可以在includes中使用every。它具有线性性能,但是在99.9999%的情况下,性能并不是至关重要的:

const compare = (array,object) => {
    const values = Object.values(object);
    return array.every(v => values.includes(v));
};

every一样,添加长度匹配的检查将更快地短路。这是以上两种情况的外观:

设置:

const compare = (array,object) => {
    const valuesArray = Object.values(object);
    if (valuesArray.length !== array.length) {
        return false;
    }
    const values = new Set(valuesArray);
    return array.every(v => values.has(v));
};

数组:

const compare = (array,object) => {
    const values = Object.values(object);
    return array.length === values.length && array.every(v => values.includes(v));
};

您甚至可以进一步添加

if (array.length === 0) {
    return true;
}

在两者的开头。

,

您可以对两个数组进行排序,然后检查它们的长度是否相同,并同时比较两个元素,从而遍历两个数组。

,

您可以使用Array.prototype.reduce()

const compare = (array,object) => {
    return Object.values(object).reduce((res,cur) => {
      return res && array.includes(cur);
    },1);
};  

console.log(compare(["one","two","three"],{ 0: "one",1: "two",2: "three" })); // => true
console.log(compare(["one","four"],2: "three" })); // => false

,

我建议同时检查数组的长度和值。

const
    compare = (array,object) => {
        const values = Object.values(object)
        return array.length === values.length && values.every(v => array.includes(v));
    };


console.log(compare(["one",2: "three" })); //  true
console.log(compare(["one",2: "three" })); // false

,
const compare = (array,object) => Object.values(object).every(n => array.includes(n));