开发者问题收集

获取数组单词长度 - JS

2017-06-20
1102

我正在创建一个函数:

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

这是我的解决方案,到目前为止,该解决方案在某些部分有效:

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: Cannot read property 'length' of undefined

3个回答

您需要使用的只是 过滤器 ...

使用 % 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']
A. L
2017-06-20

我发现此函数有两个问题。

首先, obj.keyobj["key"] 相同。您应该改用 obj[key]

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

J Steinberg
2017-06-20

在使用 for 循环 之前,您应该首先检查 key 属性是否存在,如果不存在 key 属性,则会出现上述错误

以下代码片段应该可以正常工作而不会出现任何错误。

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);
warl0ck
2017-06-20