Javascript 如何检查数组是否包含另一个对象';s的价值观?
我试图使一个函数在所有数组值都存在于对象值中时返回true 我已将对象值转换为一个名为Javascript 如何检查数组是否包含另一个对象';s的价值观?,javascript,arrays,object,Javascript,Arrays,Object,我试图使一个函数在所有数组值都存在于对象值中时返回true 我已将对象值转换为一个名为newArray的新数组;但我的问题是如何比较给定数组和新数组 const compare = function (array, object) { const newArray =Object.values(object) //compare here and return true/false }; compare(["one", "two",
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
我将对象值转换为一个新数组
我认为一个集合
会更好,因为它有一个具有次线性性能的集合,并且语义很好且清晰。但是获取集合的最简单方法是通过数组,所以…:-)
一旦设置了,
,就需要循环,在这种情况下,可能需要:
every
如果回调始终返回真实值,则返回true
,或者在回调第一次返回错误值时返回false
(此时短路,如果答案为“否”,则无需继续查找)
但是,如果您想继续使用数组,可以在每一个中使用包含。它具有线性性能,但在99.9999%的情况下,性能并不重要:
const compare = (array, object) => {
const values = Object.values(object);
return array.every(v => values.includes(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=(数组,对象)=>{
返回Object.values(Object.reduce)(res,cur)=>{
返回res&&array.includes(cur);
}, 1);
};
log(比较([“一”,“二”,“三”],{0:“一”,1:“二”,2:“三”}));//=>真的
log(比较([“一”,“二”,“四”],{0:“一”,1:“二”,2:“三”}));//=>false
我建议检查数组的长度和值
const
比较=(数组,对象)=>{
常量值=对象。值(对象)
返回array.length==values.length&&values.every(v=>array.includes(v));
};
log(比较([“一”,“二”,“三”],{0:“一”,1:“二”,2:“三”}));//真的
log(比较([“一”,“二”,“四”],{0:“一”,1:“二”,2:“三”}));//false
Object.values(Object.every)(val=>array.indexOf(val)!==-1)
应该比较什么([“一”,“三”,“二],{0:“一”,1:“二”,2:“三”})代码>给定(此处的“三”索引与对象中的键索引不对齐)您是否只有唯一的值?这是否回答了您的问题?你可以,但它不会短路。不过,这并不重要。它也不向读者提供任何语义信息,而每一个都能准确地显示正在做的事情。
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;
}
const compare = (array, object) => Object.values(object).every(n => array.includes(n));