这是我的第一篇文章,我已经研究过,但我不确定我是否在搜索中以正确的方式表达了这个问题。
我试图将对象的键与另一个对象中的键进行比较(这是针对freeCodeCamp算法的)。我的代码如下:
function whereAreYou(collection, source) {
var arr = [];
for (var i=0;i<collection.length;i++) {
console.log("Object.keys(source)= " + Object.keys(source));
console.log("Object.keys(collection[" +i + "]))= " + Object.keys(collection[i]));
console.log("collection[" +i + "].hasOwnProperty(Object.keys(source))= " + collection[i].hasOwnProperty(Object.keys(source)));
if (collection[i].hasOwnProperty(Object.keys(source))) {
var prop = Object.keys(source);
console.log("prop=" + prop);
console.log("collection[" +i + "][prop]= " + collection[i][prop]);
console.log("source[prop]= " + source[prop]);
if (collection[i][prop] === source[prop]) {
arr.push(collection[i]);
}
}
}
return arr;
}
当源参数中有多个键时,
if (collection[i].hasOwnProperty(Object.keys(source)))
即使collection [i]确实包含如下所示的键,也会返回false。
whereAreYou([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })
Object.keys(source)= a,b
Object.keys(collection[0]))= a,b
collection[0].hasOwnProperty(Object.keys(source))= false
Object.keys(source)= a,b
Object.keys(collection[1]))= a
collection[1].hasOwnProperty(Object.keys(source))= false
Object.keys(source)= a,b
Object.keys(collection[2]))= a,b,c
collection[2].hasOwnProperty(Object.keys(source))= false
[]
我的问题是为什么a,b和a,b不相等?谢谢你的时间!
答案 0 :(得分:0)
FreeCodeCamp很棒。如果这是他们所接受的一些培训的具体问题,通常他们的论坛是一个非常好的出路。他们会更多地了解您所询问的内容以及相关内容。但是,如果您只是想比较对象,这似乎相当冗长。
查看堆栈上的其他帖子以查看,这里有一些链接有助于理解比较对象。 Object comparison in JavaScript
来自MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
答案 1 :(得分:0)
我不确定hasOwnProperty
是你想要的。查看hasOwnProperty
的定义:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
您需要比较每个数组中的项目。例如,在第一次迭代:
Object.keys(collection[i]).includes("a") // true
Object.keys(collection[i]).includes("b") // true
Object.keys(collection[i]).includes(Object.keys(source)[0]) // true
Object.keys(collection[i]).includes(Object.keys(source)[1]) // true
您可以迭代Object.keys(source)
并将其与Object.keys(collection[i])
进行比较,或尝试更短的内容,请参阅:
Determining whether one array contains the contents of another array in JavaScript/CoffeeScript
您可以这样做:
function whereAreYou(collection, source) {
var arr = [];
for (var i = 0; i < collection.length; i++) {
for (var j = 0; j < Object.keys(source).length; j++) {
if (Object.keys(collection[i]).includes(Object.keys(source)[j])) {
// do your comparisons here
}
}
}
return arr;
}