javascript通过存在属性来排序对象数组,同时保持旧顺序

时间:2016-03-15 13:45:19

标签: javascript

我有一个包含大约1,500个元素的对象数组

var a = [
    {
        'name': 'jug',
        'price': 0,
    },
    {
        'name': 'watermelon',
        'price': 47,
    },
    {
        'name': 'pizza',
        'price': 0,
    },
    {
        'name': 'handkerchief',
        'price': 52,
    },
    ..........................
]

在我获取数据时,我不断用价格更新数组。

我需要使用价格重新排序元素,并保持以相同顺序排在最前面的元素。

如果不是那么清楚,可以说你有一个按特定顺序生产产品的网页,并且批量加载产品的价格。 我想把价格放在最高位置并按顺序保留,这样产品就不会跳转。然而,当我得到价格时,我想在列表上的最后一个价格之后将其推到底部。

3 个答案:

答案 0 :(得分:0)

a.sort(function(a,b){ 

  var priceA = a.price? a.price : Number.MAX_SAFE_INTEGER;
  var priceB = b.price? b.price : Number.MAX_SAFE_INTEGER;
  return a.price-b.price;
});

这将确保如果价格不可用,它们将保持在底部。

答案 1 :(得分:0)

为了使其正常工作,您需要拥有indexOfObj,它是数组中所需对象的索引:

var updatedElement = a.splice(indexOfObj, 1); // Remove the element with the updated price
a.push(updatedElement); // Add the new element to the end of the 'a' array.

答案 2 :(得分:0)

好的,我在这里做了一些假设,因为这个问题说实话并不是很清楚。但我相信你想做这样的事情: (假设newprices是一批更新数据)

// if product already in list update price, otherwise insert at bottom
var i, index, newprice;
for(i = 0; i<newprices.length; i++) {
    newprice = newprices[i];
    index = a.findIndex(function(p) { return p.name === newprice.name; });
    if(index > -1) { a[index].price = newprice.price; }
    else { a.push[newprice]; }
}

或许你想做这样的事情:

// put items that get updated prices or are new altogether at the end of the list
var i, index, newprice;
for(i = 0; i<newprices.length; i++) {
    newprice = newprices[i];
    index = a.findIndex(function(p) { return p.name === newprice.name; });
    if(index > -1) { a.splice(index, 1); }
    a.push[newprice];
}

但是,如果你更明确地说明你想要做什么,那肯定会有所帮助......