问题描述
我正在尝试创建一个在对象值中存在所有数组值的情况下返回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));