从对象键返回元素数组

时间:2017-05-27 12:47:21

标签: javascript arrays

给定一个对象和一个键,我创建了一个函数,该函数返回一个数组,该数组包含位于给定键的数组的所有元素,等于10。

如果数组为空,则应返回一个空数组,如果数组中不包含等于10的元素,则应返回空数组,如果给定键的属性不是数组,则返回空阵列。

function getElementsThatEqual10AtProperty(obj, key) {
  for(var prop in obj){
    if(obj[prop] === 10){
      return obj[key];
    }
  }
}

var obj = {
  key: [1000, 10, 50, 10]
};

var output = getElementsThatEqual10AtProperty(obj, 'key');
console.log(output); // --> IT MUST RETURN [10, 10]

知道我做错了什么吗?

7 个答案:

答案 0 :(得分:1)

在您的代码中,您将迭代Object中的所有属性。

for(var prop in obj)

所以道具将是,在你的关键词中'在第一次迭代中。然后你问obj['key'] === 10

这不是您要进行的检查,因为这基本上是[1000, 10, 50, 10] === 10

然后您可以Filter数组,查找符合条件的所有项目,是否等于10?

return obj['key'].filter(function(item) {
    return item === 10;
});

你可以更进一步,因为你知道你正在寻找的Key,当你将它传递给你的函数时,所以你不必迭代你的对象,你可以直接去它:

obj[key]

但是,正如你所说,如果它不匹配你想要返回一个空数组,所以你可以使用:

var array = (obj[key] || [])

这基本上意味着,如果obj [key]不存在,那么只需使用[]

结合整个事情看起来像:



function foobar(object, key) {  
  return (object[key] || []).filter(function(item) {
    return item === 10;
  });
}

var object = {
  unique: [1, 10, 100, 10],
  nothing: [1,2,3,4,5]
}

console.log(foobar(object, 'unique'));  // returns [10, 10]
console.log(foobar(object, 'asgasgag')); // returns [] 
console.log(foobar(object, 'nothing')); // returns []




答案 1 :(得分:1)

obj['key']是一个数组...因此它永远不会等于10。您还需要过滤该数组。

可以将Array#filter()用于此

function getElementsThatEqual10AtProperty(obj, key) {
   var arr = obj[key] || [];
    return arr.filter(function(val){
        return val === 10;
    });
}

var obj = {
  key: [1000, 10, 50, 10]
};

var output = getElementsThatEqual10AtProperty(obj, 'key');
console.log(output); // --> IT MUST RETURN [10, 10]

答案 2 :(得分:1)

如果我理解正确,您要检查key的属性obj是否为数组,如果是,则返回所有等于10的元素。

由于您已经拥有该属性的名称,因此无需迭代。只需直接访问key属性,然后检查它是否为Array类型。然后,您需要过滤数组。

以下是代码示例(不是最好的代码,但出于学习目的):

function getElementsThatEqual10AtProperty(obj, key) {
  if(obj[key] instanceof Array){ 
     // the key property is an array
     return obj[key].filter(function(v){ return v == 10;})
  }  
  // not an array
  return [];
}

答案 3 :(得分:0)

这可以通过使用filter来实现。

  

filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

我的解决方案下面我使用ES6箭头语法更简洁。您也可以直接在数组上调用.filter()并显式提供谓词(item === 10),而不是创建动态提供的函数。

const myArr = [10,100,10,1];

const filterBy = (arr, key) => arr.filter(item => item === key);

filterBy(myArr, 10); // returns [10, 10]

注意:如果不满足提供给过滤器的谓词(在这种情况下,找不到值10),将返回一个空数组。

答案 4 :(得分:0)

也许这样的事情可以帮助你朝着正确的方向前进?

function getElementsThatEqual10AtProperty(obj) {
  var response = [];
  for (var i = 0; i < obj.key.length; i++) {
     if (obj.key[i] === 10) {
       response.push(obj.key[i]);
     }
  }
  return response;
}

var obj = {
  key: [1000, 10, 50, 10]
};

var output = getElementsThatEqual10AtProperty(obj);
console.log(output);

答案 5 :(得分:0)

根据您的情况,您可以使用Array的方法reduce。在你的功能内:

 return obj[key].reduce(function (result, value) {
      if (value === 10) result.push(value)
 }, []);

MSDN参考: .reduce()

答案 6 :(得分:0)

有更短的路。人们可以使用.map&amp; .filter请看下面。

var obj = {
   key: [1000, 10, 50, 10]
};

//To get the key
var output = obj.key.map((obj,i) => obj === 10 ? obj : '').filter(String);

//To get the index
var index = obj.key.map((obj,i) => obj === 10 ? i : '').filter(String);


//log output || index
console.log(output);