Javascript 快速获取对象属性中最小/最大值的方法

Javascript 快速获取对象属性中最小/最大值的方法,javascript,jquery,Javascript,Jquery,我有一个javascript对象,如下所示: { "a":4, "b":0.5 , "c":0.35, "d":5 } 有没有一种快速的方法可以在属性中获得最小值和最大值,而不必遍历所有属性?因为我拥有的对象是巨大的,我需要每两秒获得最小/最大值。(对象的值不断变化)。min和max无论如何都必须在输入数组中循环-否则它们将如何找到最大或最小的元素 因此,只需在循环中为..快速执行一次,就可以了 var min = Infinity, max = -Infinity, x; for( x in

我有一个javascript对象,如下所示:

{ "a":4, "b":0.5 , "c":0.35, "d":5 }

有没有一种快速的方法可以在属性中获得最小值和最大值,而不必遍历所有属性?因为我拥有的对象是巨大的,我需要每两秒获得最小/最大值。(对象的值不断变化)。

min
max
无论如何都必须在输入数组中循环-否则它们将如何找到最大或最小的元素

因此,只需在循环中为..快速执行一次
,就可以了

var min = Infinity, max = -Infinity, x;
for( x in input) {
    if( input[x] < min) min = input[x];
    if( input[x] > max) max = input[x];
}
var min=Infinity,max=-Infinity,x;
用于(输入中的x){
如果(输入[x]max)max=input[x];
}

在一般情况下,如果不遍历所有n元素,就无法找到最大值/最小值(如果从1到n-1,如何知道元素n是否大于(或小于)当前的最大值/最小值)

您提到,值每隔几秒钟更改一次。如果您确切知道哪些值发生了更改,则可以从以前的“最大/最小”值开始,仅与新值进行比较,但即使在这种情况下,如果修改的其中一个值是旧的“最大/最小”,则可能需要再次对其进行循环

另一种选择——同样,只有在更改的值数量很少的情况下——是将值存储在树或堆等结构中,当新值到达时,您会适当地插入(或更新)它们。但根据你的问题,你是否能做到这一点还不清楚

如果希望在循环遍历所有元素时获取给定列表的最大/最小元素,则可以使用下面的代码段,但如果不遍历所有元素,则无法实现这一点

var list = { "a":4, "b":0.5 , "c":0.35, "d":5 };
var keys = Object.keys(list);
var min = list[keys[0]]; // ignoring case of empty list for conciseness
var max = list[keys[0]];
var i;

for (i = 1; i < keys.length; i++) {
    var value = list[keys[i]];
    if (value < min) min = value;
    if (value > max) max = value;
}
var-list={“a”:4,“b”:0.5,“c”:0.35,“d”:5};
var keys=Object.keys(列表);
var min=list[键[0]];//为简洁起见,忽略空列表的大小写
var max=列表[键[0]];
var i;
对于(i=1;i最大值)最大值=值;
}
更新:现代版(ES6+)
let obj={a:4,b:0.5,c:0.35,d:5};
设arr=Object.values(obj);
设min=Math.min(…arr);
设max=Math.max(…arr);

log(`Min value:${Min},max value:${max}`)
对于不同深度的嵌套结构,即
{node:{leaf:4},leaf:1}
,这将起作用(使用lodash或下划线):

这对我很有用:

var object = { a: 4, b: 0.5 , c: 0.35, d: 5 };
// Take all value from the object into list
var valueList = $.map(object,function(v){
     return v;
});
var max = valueList.reduce(function(a, b) { return Math.max(a, b); });
var min = valueList.reduce(function(a, b) { return Math.min(a, b); });
使用该选项,您可以写得更短

_({ "a":4, "b":0.5 , "c":0.35, "d":5 }).values().max();

这里有一个解决方案,允许您同时返回密钥,并且只执行一个循环。它对对象的条目进行排序(按val),然后返回第一个和最后一个条目

此外,它还返回排序后的对象,该对象可以替换现有对象,以便将来的排序速度更快,因为它已被半排序=优于O(n)。需要注意的是,对象在ES6中保持其顺序

const maxMinVal=(obj)=>{
const sortedEntriesByVal=Object.entries(obj.sort([,v1],,v2])=>v1-v2);
返回{
min:sortedEntriesByVal[0],
最大值:SORTEDNTRIESBYVAL[SORTEDNTRIESBYVAL.length-1],
sortedDobjbyval:sortedEntriesByVal.reduce((r[k,v])=>({…r[k]:v}),{}),
};
};
常量对象={
a:4,b:0.5,c:0.35,d:5
};
console.log(maxMinVal(obj))您可以尝试:

const obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
const max = Math.max.apply(null, Object.values(obj));
console.log(max) // 5

您也可以尝试使用
Object.values

const points={Neel:100,Veer:89,Shubham:78,Vikash:67};
const vals=对象值(点);
常量最大值=数学最大值(…VAL);
常量最小值=数学最小值(…VAL);
控制台日志(最大值);


控制台日志(分钟)
@Oleg:好吧,仅考虑到这一点,它很可能是JSON。优素福:将JSON解析为一个对象,并迭代其属性。@OlegV.Volkov我正在使用JSON.Parse()这不应该使它成为JSON吗?@Youssef解析之前它是JSON(一个字符串值)。解析后它是一个对象值。JSON是对象的字符串表示法。当你把JSON解析成一个对象时,它就不再是JSON格式了。我在你的问题中自由地修正了JSON->object,因为评论证实了这就是你的意思。这对于IE7/8来说非常好。Cheers@Niet the Dark AbsolIt不一定是真的,min和max通过数组循环来获得它们的值。更可行的做法是,他们对数组进行快速排序,并在此基础上选择最小值和最大值result@goonerify最快的排序是
O(n log n)
,它本质上比只扫描一次的
O(n)
要慢,也可以执行
max=Object.keys(obj).reduce(function(m,k){return obj[k]>m?obj[k]:m},-无穷大)
现在也可以这样做:
Math.max(…arr)@cmac我添加了一个ES6版本。@ŠimeVidas-Math.min&max函数上的3个点代表什么?Thanks@AME阅读此处:添加解释。当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何有帮助,那么您的答案对其他StackOverflow用户会更有用,特别是对于已经有公认答案的问题。请参阅:。这不描述如何获取对象属性的最小/最大值。您正在迭代对象,而不是列表
min
max
未定义。你是想用
来代替in
循环吗?谢谢@tonix,修复了它。谢谢!我试图弄清楚如何在保留与值匹配的键的同时获得最大值。这有帮助!:)
_({ "a":4, "b":0.5 , "c":0.35, "d":5 }).values().max();
const obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
const max = Math.max.apply(null, Object.values(obj));
console.log(max) // 5
var newObj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
var maxValue = Math.max(...Object.values(newObj))
var minValue = Math.min(...Object.values(newObj))
// Sorted
let Sorted = Object.entries({ "a":4, "b":0.5 , "c":0.35, "d":5 }).sort((prev, next) => prev[1] - next[1])
>> [ [ 'c', 0.35 ], [ 'b', 0.5 ], [ 'a', 4 ], [ 'd', 5 ] ]


//Min:
Sorted.shift()
>> [ 'c', 0.35 ]

// Max:
Sorted.pop()
>> [ 'd', 5 ]