从对象字段按顺序访问对象元素的数组?

时间:2017-08-08 04:56:07

标签: javascript jquery arrays sorting javascript-objects

我有一个JS对象,其中包含以下代码段:

cache

我的目标是能够遍历" baz"中的所有对象。但按顺序排列"顺序"属性,而不是存储在对象中的顺序。 " baz"中对象的顺序可以/将经常更改,因此以前对它们进行排序或按照它们所需的顺序存储它们不是一种选择。

纯JS或jQuery答案都是可以接受的。

3 个答案:

答案 0 :(得分:1)

你好,你必须对你的对象进行排序。只需使用数组的.sort即可。

以下是一个示例:

var obj = {
    "foo": "bar",
    "baz": [
        {
            "order": 2,
            "fruit": "banana"
        },
        {
            "order": 1,
            "fruit": "apple"
        },
        {
            "order": 3,
            "fruit": "peach"
        },
    ]
}

// get property
var arr = obj["baz"];

// may copy array
var counter = arr.length;
var arrCopy = new Array(counter);
while(counter--) {
    arrCopy[counter] = arr[counter];
}

// sort 
arrCopy.sort(function(a, b) { return a.order - b.order});

// iterate it
arrCopy.forEach(function(v) {
  console.log(v.fruit);
})

答案 1 :(得分:0)

你说过

  

“baz”中对象的顺序可以/经常改变......

如果你只是意味着那个,而不是他们的order属性发生了变化,那么你可以给自己另一个数组,与baz分开,它包含对象的顺序。那么它们在baz中的顺序并不重要。

var bazInOrder = theObject.baz.slice();
bazInOrder.sort(function(a, b) {
    return a.order - b.order;
});

如果您向baz添加条目,则需要将其添加(按排序位置)到bazInOrder;同样,如果您从baz删除某个条目,则需要将其从bazInOrder中删除。

您的另一个选择是向他们添加一个指向“下一个”条目的属性;例如,覆盖阵列上的链表。这又需要对添加/删除进行相当多的维护,但不仅仅是baz中的订单发生变化。

theObject.baz.slice()
         .sort(function(a, b) { return a.order - b.order; })
         .forEach(function(entry, index, arr) {
    entry.next = index < arr.length - 1 ? arr[index + 1] : null;
});

然后按顺序访问它们需要找到order = 1条目,然后使用next循环:

for (var e = theObject.baz.find(function(e) { return e.order === 1; });
     e;
     e = e.next) {
    // ...use `e`...
}

但是,链接列表再次涉及添加/删除维护。

答案 2 :(得分:0)

我猜你可以创建一个原始索引为baz的数组,其顺序为baz[n].order

有点像

var obj = {
    "foo": "bar",
    "baz": [
        {
            "order": 2,
            "fruit": "banana"
        },
        {
            "order": 1,
            "fruit": "apple"
        },
        {
            "order": 3,
            "fruit": "peach"
        },
    ]
}
var bazIndexOrder = obj.baz
  .map(({order}, index) => ({index, order}))
  .sort(({order:a}, {order:b}) => a - b)
  .map(({index}) => index);

console.log(bazOrder); // [1, 0, 2]

bazOrder.forEach(index => console.log(obj.baz[index].fruit)); // apple, banana, peach

如果ES2015 +代码吓到你了,那就

var bazIndexOrder = obj.baz.map(function (_ref, index) {
  var order = _ref.order;
  return { index: index, order: order };
}).sort(function (_ref2, _ref3) {
  var a = _ref2.order;
  var b = _ref3.order;
  return a - b;
}).map(function (_ref4) {
  var index = _ref4.index;
  return index;
});