我正在创建一个函数:
这是我迄今为止在某些方面有效的解决方案:
function getOddLengthWordsAtProperty(obj, key) {
var output = [];
for(var i = 0; i < obj.key.length; i++){
if (key in obj){
if (Array.isArray(obj[key])){
if(obj[key].length){
if(obj.key[i].split("").length % 2 !== 0){
output.push(obj.key[i]);
}
}
}
}else{
return [];
}
}
return output;
}
var obj = {
key: ['It', 'has', 'some', 'words']
};
var output = getOddLengthWordsAtProperty(obj, 'key');
console.log(output); // --> ['has', 'words']
这里的问题是我的代码返回:
TypeError:无法读取未定义的属性“length”
答案 0 :(得分:5)
您需要使用的只是filter ...
使用% 2
如果它是奇数,它将是1
这是真实的,并将返回正确的数组。
function getOddLengthWordsAtProperty(obj, key) {
if ( key in obj && Array.isArray(obj[key]) )
{
return obj[key].filter( (item) => item.length % 2 );
}
return []; // don't need else as return would end the function if it went into 'if'
}
var obj = {
key: ['It', 'has', 'some', 'words']
};
var output = getOddLengthWordsAtProperty(obj, 'key');
console.log(output); // --> ['has', 'words']
答案 1 :(得分:1)
我看到这个功能有两个问题。
首先,obj.key
与obj["key"]
相同。您想要使用obj[key]
。
其次,您应该将if (key in obj)
之类的验证放在循环之外。这样您就可以在循环声明中安全地引用obj[key].length
,而不必担心会出现错误。
答案 2 :(得分:1)
在使用key
之前,您应首先检查for loop
属性是否存在,这会在没有关键属性时出现上述错误
以下是应该没有任何错误的代码段。
function getOddLengthWordsAtProperty(obj, key) {
var output = [];
if (key in obj && Array.isArray(obj[key])) {
var len = obj.key.length;
for (var i = 0; i < len; i++) {
if (obj.key[i].length % 2 !== 0) {
output.push(obj.key[i]);
}
}
}
return output;
}
var obj = {
key: ['It', 'has', 'some', 'words']
};
var output = getOddLengthWordsAtProperty(obj, 'key');
console.log(output);
&#13;