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

Ala*_*ila 3 javascript arrays object

我正在尝试创建一个函数,如果所有数组值都存在于对象值中,则该函数返回 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", "two", "four"], { 0: "one", 1: "two", 2: "three" }); // => false
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

我将对象值转换为一个新数组

我认为 aSet会更好,因为它有一个具有亚线性性能的has方法,并且语义很好而且清晰。但是到达 a 的最简单方法Set是通过数组,所以... :-)

一旦你有了Set,这是一个循环的问题,在这种情况下可能是every

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

every返回true如果回调总是返回truthy值,或返回false的第一次回调函数返回值falsy(在这一点短路,没有理由继续找如果答案是“否”)。

但是,如果您想坚持使用数组,则可以includesevery. 它具有线性性能,但在 99.9999% 的情况下,性能无论如何都不重要:

const compare = (array, object) => {
    const values = Object.values(object);
    return array.every(v => values.includes(v));
};
Run Code Online (Sandbox Code Playgroud)

正如Nina 指出的那样,添加长度匹配的检查会更快地短路。以下是上述两种情况:

放:

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));
};
Run Code Online (Sandbox Code Playgroud)

大批:

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

你可以更进一步并添加

if (array.length === 0) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

在两者的最开始。