我将对象值转换为新的数组。
我认为使用
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;
}
在两者的开头。
Object.values(object).every(val => array.indexOf(val) !== -1)
- Christian Vincenzo Trainacompare(["one", "three", "two"], { 0: "one", 1: "two", 2: "three" });
应该返回什么结果?(这里的“three”的索引与对象中的键索引不对齐) - Nick Parsons