我有一个JS对象,其中包含以下代码段:
cache
我的目标是能够遍历" baz"中的所有对象。但按顺序排列"顺序"属性,而不是存储在对象中的顺序。 " baz"中对象的顺序可以/将经常更改,因此以前对它们进行排序或按照它们所需的顺序存储它们不是一种选择。
纯JS或jQuery答案都是可以接受的。
答案 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;
});