获取数组字长 - JS

时间:2017-06-20 03:47:02

标签: javascript arrays

我正在创建一个函数:

  • 返回一个数组,其中包含位于给定键的数组的所有奇数长度的单词元素。
  • 如果数组为空,则应返回一个空数组。
  • 如果它不包含奇数长度的元素,则应该返回一个空数组。
  • 如果给定键的属性不是数组,则应返回一个空数组。
  • 如果给定键没有属性,则应返回一个空数组。

这是我迄今为止在某些方面有效的解决方案:

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”

3 个答案:

答案 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.keyobj["key"]相同。您想要使用obj[key]

其次,您应该将if (key in obj)之类的验证放在循环之外。这样您就可以在循环声明中安全地引用obj[key].length,而不必担心会出现错误。

答案 2 :(得分:1)

在使用key之前,您应首先检查for loop属性是否存在,这会在没有关键属性时出现上述错误

以下是应该没有任何错误的代码段。

&#13;
&#13;
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;
&#13;
&#13;