如何在对象的数组中查找长度最长的数组

How to find longest length array within an array of an object?

本文关键字:数组 查找 对象      更新时间:2023-09-26

我正试图想出一个函数来返回数组中长度最长的对象。

问题是:

  1. 编写一个函数,列出所有拥有最多武器的兽人

示例:

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;
   }
}