Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何找到对象内部对象的最大属性和?_Javascript_Properties_Sum_Javascript Objects - Fatal编程技术网

Javascript 如何找到对象内部对象的最大属性和?

Javascript 如何找到对象内部对象的最大属性和?,javascript,properties,sum,javascript-objects,Javascript,Properties,Sum,Javascript Objects,我有个问题,不知道怎么解决( 我有一个脚本,其中包含对象内部的对象,例如: var s = { 1: { type: "main", ... values: { speed: 10, dexterity: 5, jump: 1 } }, 2: { type: "main", ... values: { speed: 8, dexterity: 3, jump

我有个问题,不知道怎么解决(

我有一个脚本,其中包含对象内部的对象,例如:

var s = {
  1: {
    type: "main",
    ...
    values: {
      speed: 10,
      dexterity: 5,
      jump: 1
    }
  },
  2: {
    type: "main",
    ...
    values: {
      speed: 8,
      dexterity: 3,
      jump: 13
    }
  },
  3: ...
}
我需要在
s
对象中找到一个元素,该元素具有一些
值的最大总和
对象属性

例如,我需要找到一个属性总和最高的对象
speed
dextrity

这里是1号元素,因为它的总和是
10+5
,而不是2号元素,2号元素的总和是
8+3

,给定上述代码

var biggest= s[Object.keys(s).filter(function(a,b,c){ 
   a=s[a];
   return (b=a.values.speed + a.values.dexterity) > this[0] ?
      (this[0]=b) : 0;
}, [0]).slice(-1)[0]];
试试这个:

function getMax(obj) {
    var max = 0;
    var maxKey;
    for (var key in obj) {
        var cur = obj[key];
        var values = cur.values;
        var total = values.speed + values.dexterity;
        if (total > max) {
            max = total;
            maxKey = key;
        }
    }
    return maxKey;
}
演示:

它将返回总数最高的对象的键(
1
2
3
,等等)


您可以将其称为
getMax(s);

这里有一种方法可以找到它,它允许您从预定义的属性中选择要求和的属性

function largest(s, speed, dexterity, jump) {
    var i, j, b = {i: null, j: -Infinity};
    for (i in s) { // loop over every key
        j =   ((    speed || 0) && s[i].values.speed    ) // add chosen
            + ((dexterity || 0) && s[i].values.dexterity)
            + ((     jump || 0) && s[i].values.jump     );
        if (j > b.j) b.i = i, b.j = j; // if largest, remember
    }
    return b.i; // return key of largest
}
使用示例
s

largest(s, 1, 1, 0); // 1
largest(s, 1, 0, 1); // 2

我看到你正在使用递增的非负整数作为对象的属性。为什么不使用数组呢?@RickViscomi,它可以来自数据库,并且是一个自动递增的主数组key@RickViscomi,我所用的整数只是一个例子。这里没有数字,而是一些标题OK,只是一个观察如果这些是公共对象,你可以考虑添加一个自定义的<代码> Value> <代码> >方法,返回代码> Test.Frase+这个.Dealthys @ LAN,坦白地说,我不想在对象中使用循环超过1000个项目。@ NikitaShelimov,不管你愿不愿意,它们都会被你的代码明确地使用,或者在内部被一个对象的SPECF使用。ic方法。@NikitaShelimov我更新了我的答案,不再使用
参数
做太多的工作,假设我们只使用
速度
灵巧性
。下面是一个jsperf,它显示我的两个函数都比
过滤器
解决方案快:。很难真正测试,因为对象只有3项,而不是10项00@lan事实上,循环速度更快。:)