【问题标题】:Javascript: Filtering twodimensional arrayJavascript:过滤二维数组
【发布时间】:2011-05-24 08:06:30
【问题描述】:

关于如何根据数值对 javascript 数组进行排序的示例有很多。然而,从myArray 中获取所有元素的合适方法是什么?属性为prop1,其对应的值是value1

这是我的数组:

var myArray = [
{
    "id":"2",
    "name":"My name",
    "properties":{"prop1":"value1"}
}];

谢谢

【问题讨论】:

    标签: javascript arrays sorting filter


    【解决方案1】:

    提供一个比较函数来按任意属性排序:

    function compareMyObjects(a, b) {
      var valA = a.properties.prop1.value1;
      var valB = b.properties.prop1.value1;
    
      if(valA > valB) return 1;
      if(valA < valB) return -1;
      return 0;
    }
    
    myArray.sort(compareMyObjects);
    

    https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

    【讨论】:

    • 这个 排序 数组,而不是过滤它,prop1 也是一个字符串,所以你在排序中走得太远了一个属性:)
    【解决方案2】:

    您可以通过点或括号符号访问它并将匹配的成员推送到您的新/过滤数组,例如:

    var newArray = [];
    for(var i=0, l = myArray.length; i<l; i++) {
      if(myArray[i].properties.prop1 == "value1") newArray.push(myArray[i]);
    }
    

    不过,您的问题有点模棱两可,如果您想获取 {"prop1":"value1"} 对象,而不是父对象,那么只需将 newArray.push(myArray[i]) 更改为 newArray.push(myArray[i].properties)

    【讨论】:

    【解决方案3】:

    遍历数组中的每个元素。对于每个元素,检查每个属性以查看它是否与您要查找的匹配。

    function filterArray(array, property, value) {
        var newArray = [];
        for (var i = 0; i < array.length; i++) {
            for (var j in array[i].properties) {
                if (j === property && array[i].properties.hasOwnProperty(j)) {
                    if (array[i].properties[j] == value) {
                        newArray.push(array[i]);
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 这不会检查任何地方的值,它只是将所有新对象推送到新数组,如果有超过 1 个子属性,也会多次推送。
    • 当您可以直接访问该属性时为什么要循环? :)
    【解决方案4】:
    var newarray=myarray.filter(function(itm){
       return itm.properties.prop1==='value1';
    });
    

    过滤器,就像数组方法 indexOf 和 map 一样,可能值得为没有它的浏览器提供——这个版本来自 Mozilla 开发者网站——

    if(!Array.prototype.filter){
        Array.prototype.filter= function(fun, scope){
            var L= this.length, A= [], i= 0, val;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        val= this[i];
                        if(fun.call(scope, val, i, this)){
                            A[A.length]= val;
                        }
                    }
                    ++i;
                }
            }
            return A;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2018-12-28
      • 1970-01-01
      • 2021-05-24
      • 2015-09-23
      相关资源
      最近更新 更多