Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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_Arrays_Object_Underscore.js - Fatal编程技术网

Javascript 按属性查找多维对象中的最低数值

Javascript 按属性查找多维对象中的最低数值,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

我有一个JSON对象,它是一个对象数组,我想在其中找到一个对象,该对象的值尽可能低,并且给定的属性名不为null

_.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个数字,等等。然而,你在这里,让我在一个与验证完全无关的地方验证数据,这个问题不要求数据验证。为什么?