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

3

我正在尝试编写一个函数,如果所有数组值都出现在对象值中,则返回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

Object.values(object).every(val => array.indexOf(val) !== -1) - Christian Vincenzo Traina
compare(["one", "three", "two"], { 0: "one", 1: "two", 2: "three" }); 应该返回什么结果?(这里的“three”的索引与对象中的键索引不对齐) - Nick Parsons
你是否只有唯一的值? - Nina Scholz
这个回答解决了你的问题吗?如何在JavaScript中比较数组? - Rahul Bhobe
5个回答

5
我将对象值转换为新的数组。
我认为使用has方法具有次线性性能和良好明确的语义,所以使用Set会更好。但是,获得Set最简单的方法是通过数组,所以... :-)
一旦你拥有了Set,就只需要循环遍历,这种情况下可能使用every
const compare = (array, object) => {
    const values = new Set(Object.values(object));
    return array.every(v => values.has(v));
};
every函数会在回调函数总是返回真值时返回true,或者在回调函数第一次返回假值时返回false(在那一点上短路,如果答案是否定的就没有继续查找的必要)。
如果您想坚持使用数组,可以在every中使用includes。它具有线性性能,但在99.9999%的情况下,性能并不重要:
const compare = (array, object) => {
    const values = Object.values(object);
    return array.every(v => values.includes(v));
};

正如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));
};

数组:

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;
}

在两者的开头。


3
你可以对两个数组进行排序,然后检查它们的长度是否相同,同时循环遍历两个数组比较它们的每个元素。

3

您可以使用 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", "two", "four"], { 0: "one", 1: "two", 2: "three" })); // => false


可以,但它不会短路。虽然这通常不重要,但它也不向读者提供任何语义信息,而every则明确指出了正在进行的操作。 - T.J. Crowder

3

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

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


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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接