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)
我将对象值转换为一个新数组
我认为 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(在这一点短路,没有理由继续找如果答案是“否”)。
但是,如果您想坚持使用数组,则可以includes在every. 它具有线性性能,但在 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)
在两者的最开始。