【发布时间】:2018-12-11 04:05:23
【问题描述】:
function whatIsInAName(collection, source) {
//The purpose is to return an array which displays all objects which share name:value pairs in 'collection' and 'source.'
var arr = [];
var temp = [];
for (var i = 0; i < collection.length; i++) {
var n = 0;
loop0:
for (var j = 0; j < Object.keys(source).length; j++) {
if (collection[i].hasOwnProperty(Object.keys(source)[j]) && collection[i][Object.keys(source)[j]] == Object.values(source)[j] ) {
for(var k = 0; k < Object.keys(collection[i]).length; k++) {
if (Object.keys(source).includes(Object.keys(collection[i])[k])) {
n += 1;
}
}
if (n == (Object.keys(source)).length){
arr.push(collection[i]); //PROBLEM EXISTS HERE, seemingly.
//If this is commented out no errors occur.
break loop0;
}
}
}
}
console.log(arr); //This logs the desired result.
return arr; //This returns a type error.
}
//This is what I use to test which prompts the type error.
console.log(whatIsInAName(whatIsInAName([{ "apple": 1 }, { "apple": 1 }, { "apple": 1, "bat": 2 }], { "apple": 1 })));
当我运行这段代码时,预期的输出是:[{ 苹果:1 }, { 苹果:1 }, { 苹果:1个, 蝙蝠:2 }],事实上,如果 'console.log(arr)' 存在于那里,控制台将读取该输出。
我遇到的问题是,如果输入中的任何对象已被推送到预期的输出数组“arr”,那么在返回函数时控制台将记录错误:
TypeError: Cannot convert undefined or null to object
at Function.keys (<anonymous>)
at whatIsInAName (biyohehake.js:13:32)
尽管在尝试返回“arr”之前立即将所需的“arr”内容记录到控制台,但它仍会输出此错误,这似乎是问题所在。我真的很困惑它可以记录数组但不能返回它;我错过了什么?
【问题讨论】:
-
你有一个内部的
whatIsInAName()和一个外部的whatIsInAName()调用。外部没有第二个参数。source因此未定义,这会导致错误。:jsfiddle.net/khrismuc/eh3wrskz -
让这成为所有人关于复制粘贴和狭隘视野的危险的教训。
-
此外,如果这只是通用键和值,则可以大大缩短此算法:jsfiddle.net/khrismuc/yzf7bsmr
-
当然,我已经删除了冗余,因为我不再偏执了,我在函数中犯了一个根本性错误。
标签: javascript arrays object typeerror