Javascript 按属性查找多维对象中的最低数值
我有一个JSON对象,它是一个对象数组,我想在其中找到一个对象,该对象的值尽可能低,并且给定的属性名不为nullJavascript 按属性查找多维对象中的最低数值,javascript,arrays,object,underscore.js,Javascript,Arrays,Object,Underscore.js,我有一个JSON对象,它是一个对象数组,我想在其中找到一个对象,该对象的值尽可能低,并且给定的属性名不为null _.min(arr, function(o){ return o[prop]; }); 这是我最后一次尝试的,但似乎没有任何选择,要么有效,要么为我提供我想要的。有没有一种干净的方法可以做到这一点 Array.prototype.min=function(){ Array.prototype.min = function() { var selector = fun
_.min(arr, function(o){
return o[prop];
});
这是我最后一次尝试的,但似乎没有任何选择,要么有效,要么为我提供我想要的。有没有一种干净的方法可以做到这一点 Array.prototype.min=function(){
Array.prototype.min = function() {
var selector = function(a) {
return a;
};
if(arguments.length>0) {
selector = arguments[0]; //can also check if it's a function if you don't trust yourself or other developers using this extension
}
if(this.length==0) return null;
var min = this[0];
for(var i=0;i<this.length;i++) {
if(selector(min)>selector(this[i])) min=this[i];
}
return min;
}
//usage
myArr.min(function(obj) {return obj.intProperty;});
变量选择器=函数(a){
返回a;
};
如果(参数.length>0){
selector=arguments[0];//如果您不信任自己或其他使用此扩展的开发人员,还可以检查它是否是函数
}
if(this.length==0)返回null;
var min=此[0];
对于(var i=0;iselector(this[i]),min=this[i];
}
返回最小值;
}
//用法
myArr.min(函数(obj){return obj.intProperty;});
\uu.first(\uu.sortByOrder(arr,prop,'asc',\uu.isFinite))
最干净、最短的方法
或者如果你不在乎无限
.first(uu.sortByOrder(arr,prop,'asc',!\uu.isNaN))
这是一个纯JavaScript解决方案。不需要额外的库
var a = [
{value: null},
{value: "foo"},
{value: Infinity},
{value: 1},
{value: -2},
{value: 5},
{value: 10},
{value: 5}
]
// Filter away the invalid values
a = a.filter(function(o) {
return typeof o.value === "number" && Number.isFinite(o.value);
})
// Sort them the way you want
.sort(function(o1, o2) {
return o1.value > o2.value;
});
// The first object now contains the lowest value
console.log(a);
Math.min.apply(0,u.map(arr,函数(o){returno[prop];}))
Math.min.apply(0,u.pull(arr,prop))
Math.min.apply将返回NaN,如果所有值都不是一个数字var arr=[{lol:0},{lol:'lol'}];Math.min.apply(Math,arr);//NaN@KamijouTouma:这就是为什么你需要先提取数字。。。您还可以.filter(Number.isFinite)
来防止意外的NAN:[1/0,1,0,-0,无穷大].filter(Number.isFinite)
所以Math.min.apply(0,u.pulk(arr,prop).filter(Number.isFinite))
是您正在寻找的机器人:安全且快速。排序是一项艰巨的工作,Math.min.apply不是更快吗?@dandavis非常肯定u.sortByOrder比u.map也更快。如果所有值都不是数字,var arr=[{lol:0},{lol:'lol}];Math.min.apply(0,u.map(arr,函数(o){returno['lol']];}));//NaN
我看不出排序如何比转换更快,尤其是通过用户区域函数工作的排序,每个元素可以触发多次>n
,需要比较硬编码的逻辑,然而,Pull/map总是运行n次
不进行比较。@dandavis经过测试,无法获得性能差异,因为当我试图获取执行函数所需的时间时,他们都返回了0。您可以使用performance.now()
来计算单个空循环迭代的时间差;)NaN还有数字的类型。。。无穷大[1/0,1,0,-0,无穷大].filter(Number.isFinite)
你试过吗?因为它不返回NaN,因为它无法返回NaN。这段代码在任何时候都不会尝试调用对数字的隐式转换,并将该值用作返回值。事实上,我刚刚用这行代码测试了这段代码:[{prop:'1'},{prop:'2'}].min(函数(o){return o.prop})代码>你知道什么?它起作用了。但它是向后的。我弄错了比较运算符,
。但如果您担心的话,没有什么可以阻止您添加自定义比较回调,或者根据您认为适合您的实现的方式修改此代码。它返回正确的结果{prop:“1”}
,即使用户(使用扩展的人)有责任提供正确、一致的输入。扩展完全按照它应该做的做。如果希望将其与更灵活的规则一起使用,请继续添加另一个参数,即comparer回调,以便它可以处理不区分大小写的字符串字母顺序或其他任何内容。这超出了这个问题的范围。我刚才注意到的另一件事是,你正在比较字符串,无论如何我应该说[{prop:'prop'},{prop:NaN},{prop:1},{prop:2}].min(函数(o){return o.prop})代码>和最小值一样,您可以假设它们表示数字,而不是字符串文字。您甚至不检查该值是否实际上是一个数字,这就是为什么您没有得到NaN或错误。标题上还写着“按属性查找多维对象中的最低数值”,很明显,他们想要的是数字,而不是像“2”这样的数字的字符串文本版本使用JS以外的任何语言都不允许您的数据出现这种混乱。提供有效数据是用户(使用此扩展的用户)的责任。无效数据=可能的意外结果。我在这里不是要为所有男人的问题提供最终的解决方案。如果我开始检查每一个可用的场景,这个扩展将非常大,以至于没有人会真正使用它。这超出了问题的范围,因为任何非整数值都必须计算为某个值,或者抛出一个错误。他没有要求整数验证器。看,有很多问题是真正不完整的。PHP回答SQL注入,正则表达式解析HTML,查询不在
结构中,jQuery用于添加2个数字,等等。然而,你在这里,让我在一个与验证完全无关的地方验证数据,这个问题不要求数据验证。为什么?