Javascript - 使用基于对象值的对象对数组进行排序

时间:2017-08-09 18:09:31

标签: javascript arrays sorting

所以我试图用基于对象值的对象对数组进行排序。

var mostCheapHistory [ { lowestTitle: title goes here, lowestPrice: 100 }, another obj, another, another } ]

我想根据价格对它们进行分类,所以我想出了这个:

var historyObj = mostCheapHistory[0];

for(var y in mostCheapHistory){
    nextObj = mostCheapHistory[y];

    console.log('Is '+ historyObj.lowestPrice + ' more as ' + nextObj.lowestPrice + ' ?');
    console.log(historyObj.lowestPrice > nextObj.lowestPrice);
    console.log('-----')
}

这是输出......

Is 124.98 more as 124.98 ?
false
-----
Is 124.98 more as 18.59 ?
false
-----
Is 124.98 more as 25.9 ?
false
-----
Is 124.98 more as 26.99 ?
false
-----
Is 124.98 more as 34.76 ?
false
-----

到底是怎么回事?显而易见的是,124.98更多是34.76而它却给出了假的吗?

使用以下代码制作数组:

for(var x=0; x < items.length; x++){
            var title = items[x].title[0];
            var price = items[x].sellingStatus[0].currentPrice[0].__value__;

            var item = 
                { 
                    lowestPrice : price,
                    lowestTitle : title
                }

            if(x === 0){
                mostCheapHistory.push(item);                
            }
            else{
                for(var y=0; y < mostCheapHistory.length; y++){
                    if(mostCheapHistory[y].lowestPrice > price ){
                        if(mostCheapHistory.length < 5){
                            mostCheapHistory.push(item);
                            break;
                        }
                        else{
                            mostCheapHistory[y] = item;
                            break;
                        }
                    }
                }
            }
        }

4 个答案:

答案 0 :(得分:2)

使用预定义的排序功能:

mostCheapHistory.sort(function(a,b){
    return a.lowestPrice - b.lowestPrice;
}

+您的代码可能是推送字符串而不是数字,这解释了为什么124.98 > 34.76 => true'124.98' > '34.76' => false,因为字符串'34 .76'在字符串比较中大于'124.98'。 使用parseFloat()获取价格,然后再次检查。

答案 1 :(得分:2)

看起来,您正在比较字符串而不是数值。如果你说(在评论中),那就是排序功能

array.sort((a, b) =>  a.lowestPrice - b.lowestPrice);

解决了您的问题,然后此排序回调使用隐式转换来使用减号-运算符进行编号。

结果是一个排序数组,其值为字符串。

答案 2 :(得分:0)

您可以使用Array.prototype.sort()(See MDN documentation

根据价格对这些进行排序

e.g。

var data = [
{
  title: "title1",
  value: 123
},
{
  title: "title2",
  value: 324
},
{
  title: "title3",
  value: 142
}];

var sorted = data.sort(function(a, b) {
  return a.value > b.value;
});

答案 3 :(得分:0)

我认为lowestPrice的类型是字符串而不是float,使用parseFloat(historyObj.lowestPrice)来比较这两个值