我试图想出一个函数,它返回一个数组中长度最长的数组的对象。
以下是问题:
示例:
NOMORE_FOR_THREADS
这就是我到目前为止所做的:
var orcs = [{
name: 'Orgoth',
strength: 9001,
weapons: ['Bone ax', 'Mace of Strength']
}, {
name: 'Blaroguhh',
strength: 500,
weapons: ['Cheeseburger', 'Spear of the Hut']
}, {
name: 'Mark',
strength: 543,
weapons: ['Ax of Defense', 'Dagger', 'Sword']
}]
getMostWeapons(orcs);
// => {name: 'Mark', strength: 543, weapons: ['Ax of Defense', 'Dagger', 'Sword' ]}
答案 0 :(得分:2)
.filter
用于返回符合条件的所有数组元素。由于在你通过所有兽人之前你不知道最大长度,你不能在一次通过中使用它来找到要返回的兽人。
只需使用一个普通的循环,将武器的长度与迄今为止看到的最长武器进行比较。如果时间更长,请用此更换最长的。
function getMostWeapons(orcs) {
var longest = 0;
var longestOrcs = [];
orcs.forEach(function(orc) {
if (orc.weapons.length > longest) {
longestOrcs = [orc];
longest = orc.weapons.length;
} else if (orc.weapons.length == longest) {
longestOrcs.push(orc);
}
});
return longestOrcs;
}
答案 1 :(得分:2)
.filter()
并不是你想要的,因为如果没有先通过查看最大长度是什么,你就不会知道你在过滤什么。可以使用.reduce()
(副作用),但是你并没有像.reduce()
那样积累单个值。因此,仅使用.forEach()
和几个父范围变量来跟踪我们的状态是有意义的。
要返回具有最大长度的所有对象,您可以执行此操作(在可以运行的代码段中查看结果)。这将返回具有最大长度的所有对象的数组。
var orcs = [{
name: 'Orgoth',
strength: 9001,
weapons: ['Bone ax', 'Mace of Strength']
}, {
name: 'Blaroguhh',
strength: 500,
weapons: ['Cheeseburger', 'Spear of the Hut']
}, {
name: 'Mark',
strength: 543,
weapons: ['Ax of Defense', 'Dagger', 'Sword']
}];
function getMostWeapons(o) {
var max = 0, maxObj = [];
o.forEach(function(item) {
if (item.weapons.length > max) {
max = item.weapons.length;
maxObj = [item];
} else if (item.weapons.length === max) {
maxObj.push(item);
}
});
return maxObj;
}
var max = getMostWeapons(orcs);
log(max);
function log(x) {
document.write(JSON.stringify(x));
}
答案 2 :(得分:1)
你 可以使用filter
虽然它几乎不可读,但却无法调用"良好的编码"有明确的意识,但当其他人可以使用forEach
一个函数而不是一个简单的循环没有任何正当理由......; - )
JSON.stringify(
orcs.sort(function(a,b){
return b.weapons.length - a.weapons.length;
}).filter(function(value,index,array){
return value.weapons.length == array[0].weapons.length;
})
)
答案 3 :(得分:0)
我分为两个函数,一个用于查找最大值,另一个用于查找具有该最大值的所有orc:
function getMostWeapons(allOrcs) {
return allOrcs.reduce((max, currentOrc) =>
Math.max(max, currentOrc.weapons.length), 0);
}
function getOrcsWithMostWeapons(allOrcs) {
let maxWeapons = getMostWeapons(allOrcs);
return allOrcs.filter(orc => orc.weapons.length === maxWeapons);
}
请注意,即使只有一个兽人,也会返回一个数组。我发现最好总是返回相同的类型。
答案 4 :(得分:0)
试试这个
var length=Math.max.apply(Math,orcs.map(function(o){return o.weapons.length;}));
var obj=orcs.find(function(x){ return x.weapons.length == length;}); // single object
var objList=orcs.filter(function(x){ return x.weapons.length == length;}); // multple
console.log(obj);
console.log(objList);
答案 5 :(得分:0)
最新答案,但是如果有人来这里寻找相似答案的话很好,我将当前答案转换为in用,也更通用了
function getLargest(o) {
var max = 0, maxObj = [];
for ( var item in o)
{
if (o[item].length > max) {
max = o[item].length;
maxObj = [item];
} else if (o[item].length === max) {
maxObj.push(item);
}
};
return maxObj;
}
答案 6 :(得分:-3)
带有长度变量的简单循环可能是最好的方法
function getMostWeapons(orcs) {
var len = 0; //longest
for( x in orcs ){ //simple loop
len = len < orcs[x].weapons.length ? orcs[x].weapons.length : len;
}
}