迭代特定订单上的对象

时间:2018-03-20 04:07:51

标签: javascript json javascript-objects

我有一些像这样的JSON:

{ 
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1 },
} 

现在我需要对这个对象进行交互并在第一级(a,b和c)的每个属性上调用一个函数,但我必须使用" index"财产,像" c"首先,然后" b"最后" a"。

但是我读到我不应该使用for循环:

  

for ... in循环以任意顺序迭代对象的属性(有关为什么不能依赖于迭代的看似有序性的原因,请参阅delete运算符,至少在跨浏览器设置中)。

然后我该怎么做?

由于

6 个答案:

答案 0 :(得分:5)

你可以,

  1. 使用Object.keys()将对象的属性作为数组获取。
  2. 使用sort()对对象的属性进行排序。
  3. 使用forEach()遍历已排序的项目(按照数组的升序执行)。
  4. var items = {
      "a": {
        "text": "text",
        "index": 5
      },
      "b": {
        "text": "text",
        "index": 3
      },
      "c": {
        "text": "text",
        "index": 1,
      }
    };
    
    Object.keys(items).sort(function(a, b) {
      return items[a].index - items[b].index;
    }).forEach(doStuff);
    
    function doStuff(key) {
      console.log(items[key]);
    }

答案 1 :(得分:2)

您可以使用getOwnPropertyNames



let obj = { 
  "a": { "text": "text", "index": 5 },
  "b": { "text": "text", "index": 3 },
  "c": { "text": "text", "index": 1 }
};

function test(p) { 
    console.log(p);
}

Object.getOwnPropertyNames(obj)
      .reverse() 
      .forEach(function(p){
         test(obj[p]);
      });




答案 2 :(得分:1)

您可以尝试以下操作:

  1. 根据索引将对象转换为具有按排序顺序排列的元素的数组。
  2. 而不仅仅是对排序属性的forEach()。
  3. 排序功能可以实现为:

    
    
    var obj = { 
    "a": { "text": "text", "index": 5 },
    "b": { "text": "text", "index": 3 },
    "c": { "text": "text", "index": 1},
    }
    
     function sortProperties(obj, sortedBy, isNumericSort, reverse) {
                sortedBy = sortedBy || 1; // by default first key
                isNumericSort = isNumericSort || false; // by default text sort
                reverse = reverse || false; // by default no reverse
    
                var reversed = (reverse) ? -1 : 1;
    
                var sortable = [];
                for (var key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        sortable.push([key, obj[key]]);
                    }
                }
                if (isNumericSort)
                    sortable.sort(function (a, b) {
                        return reversed * (a[1][sortedBy] - b[1][sortedBy]);
                    });
                else
                    sortable.sort(function (a, b) {
                        var x = a[1][sortedBy].toLowerCase(),
                            y = b[1][sortedBy].toLowerCase();
                        return x < y ? reversed * -1 : x > y ? reversed : 0;
                    });
                return sortable; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ]
            }
            
            sortProperties(obj, 'index', true, false);
    &#13;
    &#13;
    &#13;

答案 3 :(得分:0)

另一个解决方案是存储对象键并将其反转,然后使用对象键进行迭代。

&#13;
&#13;
var obj = { 
	"a": { "text": "text", "index": 5 },
	"b": { "text": "text", "index": 3 },
	"c": { "text": "text", "index": 1 }
};
var yourFunction = console.log;
var keys = Object.keys(obj);
keys.reverse();
for (var i = 0; i < keys.length; i++) {
	yourFunction(obj[keys[i]]);
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

如果您想以相反的顺序访问json项目,也可以使用reverse() javascript方法。
使用Object.keys()来获取json的所有键的数组 使用reverse()方法反转数组
最后你可以使用javascript forEach()方法来处理json的项目。示例代码如下所示

let obj = {
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1 },
}

Object.keys(obj)
            .reverse()
            .forEach(ele => {
              console.log(obj[ele]);
            });

访问 This link ,详细了解reverse()方法

答案 5 :(得分:-1)

可能你应该使用Object.keys获取所有属性的列表,对列表进行排序,然后迭代它。