如何在对象数组中找到最长的数组?

时间:2015-11-06 04:09:30

标签: javascript dictionary filter

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

以下是问题:

  1. 编写一个功能,列出所有拥有最多武器的兽人。
  2. 示例:

    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' ]}
    

7 个答案:

答案 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);

JSFIDDLE

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