给定一个对象和一个键,我创建了一个函数,该函数返回一个数组,该数组包含位于给定键的数组的所有元素,等于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]
知道我做错了什么吗?
答案 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);