JavaScript - 中级算法脚本
我正在尝试创建一个 JavaScript 函数来查看对象数组(第一个参数)并返回具有匹配属性和值对的所有对象的数组。
虽然在 freeCodeCamp 给出了正确的解决方案,我想知道我的代码中有哪些问题和错误。另外,我找到了一个关于堆栈溢出的解决方案,但我没有发现我的代码有什么问题。
这是我的代码
function whatIsInAName(collection, source) {
// What's in a name?
var arr = [];
// Only change code below this line
var obj;
var prop;
var keys = Object.keys(source);
for (var i = 0; i < collection.length; i++) {
for (var j = 0; j < Object.keys(source).length; j++) {
obj = collection[i];
prop = Object.keys(source)[j];
if (obj.hasOwnProperty(prop) && obj.prop === source.prop) {
arr = arr.concat([obj]);
}
}
}
// Only change code above this line
return arr;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
这是我得到的结果
[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }]
代替
[{ first: "Tybalt", last: "Capulet" }]
最佳答案
在您的 if 语句中,您需要使用 obj[prop] === source[prop]
而不是 obj.prop === source。 Prop
。参见 computed property names .
由于两个对象都不包含属性 prop
,因此条件的计算结果始终为 true
(undefined === undefined
为 真
)。
演示
(请注意,我将 obj = collection[i];
移到了外部循环,因为每次都在内部循环中分配它是多余的)
function whatIsInAName(collection, source) {
// What's in a name?
var arr = [];
// Only change code below this line
var obj;
var prop;
var keys = Object.keys(source);
for (var i = 0; i < collection.length; i++) {
obj = collection[i];
for (var j = 0; j < Object.keys(source).length; j++) {
prop = Object.keys(source)[j];
if (obj.hasOwnProperty(prop) && obj[prop] === source[prop]) {
arr = arr.concat([obj]);
}
}
}
// Only change code above this line
return arr;
}
let res = whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
console.log(res)
关于Javascript 函数调试 - 为什么这个过滤器函数不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100385/