如何在对象的数组中查找长度最长的数组
How to find longest length array within an array of an object?
我正试图想出一个函数来返回数组中长度最长的对象。
问题是:
- 编写一个函数,列出所有拥有最多武器的兽人
示例:
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' ]}
这就是我目前所拥有的:
function getMostWeapons(orcs) {
var length = 0;
return orcs.filter(function (obj) {
return obj.filter(function (val) {
if (val.length > length) {
return (length = val.length);
}
});
});
}
.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;
}
.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));
}
您可以使用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;
})
)
我将分为两个函数,一个用于查找最大值,另一个用于找到所有具有该最大值的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);
}
注意,即使只有一个兽人,这也会返回一个数组。我发现最好总是返回相同的类型。
像这样尝试
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);
JSFIDDLE
答案很晚,但如果有人来这里寻找类似的答案,那就好了,我取了当前的答案,并将其转换为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;
}
带有长度变量的简单循环可能是的最佳方式
function getMostWeapons(orcs) {
var len = 0; //longest
for( x in orcs ){ //simple loop
len = len < orcs[x].weapons.length ? orcs[x].weapons.length : len;
}
}
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- Lodash 从值数组中查找数组中的值
- 使用JS查找数组的平均值
- 咖啡脚本数组查找下一个位置
- 角度:通过数组查找其索引返回对象的内容
- 在循环中缓存数组查找是否有任何性能提升
- 在关联数组查找中未定义
- javascript数组查找具有当前日期+日期的最近日期
- jQuery使用相同的数组查找和删除数组中的字符串
- javascript数组查找时间最长,ID第一,如果超过当前值
- Javascript数组查找最大值
- 在Moongoose (MongoDB)中通过嵌入引用数组查找文档
- 在mongodb中通过数组查找一个字段的文档
- 使JavaScript中的数组查找更高效
- Javascript数组查找对象或元组
- 高效的Javascript数组查找
- 如何在猫鼬中按对象数组查找
- If else数组查找
- 不能在嵌入式数组查找中使用计数变量
- 对象键vs数组查找性能