【问题标题】:I want to sort an array of objects based on two properties我想根据两个属性对对象数组进行排序
【发布时间】:2017-06-22 11:45:39
【问题描述】:

我想用两个属性布尔值和 Int 值对 JavaScript 中的对象数组进行排序。我想要这样的输出:

{ first_nom: 'sumeet', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 40},
4:55 PM { first_nom: 'Pirate', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 50},
4:55 PM { first_nom: 'Lazslo', last_nom: 'Jamf'   ,offerApplicable: 'TRUE' ,price: 60 },
4:55 PM { first_nom: 'jitendra', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 101}

所有具有真值的对象首先也按价格排序,然后所有具有布尔值的对象为假。我可以按布尔值对它们进行排序,但我也想按价格对它们进行排序。

我试过了

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'   ,offerApplicable: 'TRUE' ,price: 60 },
    { first_nom: 'Pig',    last_nom: 'Bodine'  , offerApplicable: 'FALSE' ,price: 100},
    { first_nom: 'Pirate', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 50},
    { first_nom: 'nithesh',    last_nom: 'Bodine'  , offerApplicable: 'FALSE' ,price: 40},
    { first_nom: 'sumeet', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 40},
    { first_nom: 'mahesh',    last_nom: 'Bodine'  , offerApplicable: 'FALSE' ,price: 40},
    { first_nom: 'jitendra', last_nom: 'Prentice' ,offerApplicable: 'TRUE' ,price: 101}
];
function compare(a,b) {
    var aConcat = a["offerApplicable"] + a["price"];
      var bConcat = b["offerApplicable"] + b["price"];
  if (aConcat < bConcat )
    return 1;
  if (aConcat > bConcat )
    return -1;
  return 0;

}`enter code here`

console.log(objs.sort(compare));

请帮助提前谢谢。

【问题讨论】:

  • 你认为'TRUE' + 60的结果究竟是什么?
  • @UnholySheep 我认为他理解正确(几乎)。他认为将价格连接到“offerApplicable”将使他首先按 TRUE/FALSE 排序,然后再按价格排序。他出错的地方是,虽然 TRUE/FALSE 在技术上将首先被“排序”,但剩余的价格被排序/比较为一个字符串,而不是一个数值,例如'60' &gt; '400' === true.

标签: javascript arrays sorting


【解决方案1】:

试试这个比较功能

function compare(a,b) {
  if (a.offerApplicable == b.offerApplicable)
    return (a.price > b.price)
  else return (a.offerApplicable < b.offerApplicable)
}

【讨论】:

    【解决方案2】:

    你需要做三项检查:

    1. 首先测试(a.offerApplicable == 'FALSE' && b.offerApplicable == 'TRUE'),然后返回1
    2. 然后测试是否(a.offerApplicable == b.offerApplicable == 'TRUE')然后返回a.price &gt; b.price
    3. 否则测试如果(a.offerApplicable == b.offerApplicable)然后返回a.price &gt; b.price

    这应该是你的代码:

    objs.sort(function compare(a,b) {
      if (a.offerApplicable == 'FALSE' && b.offerApplicable == 'TRUE')
        return 1;
      else if(a.offerApplicable == b.offerApplicable == 'TRUE')
         return a.price > b.price
      else if(a.offerApplicable == b.offerApplicable)
        return a.price > b.price
    });
    

    演示:

    var objs = [{
        first_nom: 'Lazslo',
        last_nom: 'Jamf',
        offerApplicable: 'TRUE',
        price: 60
      },
      {
        first_nom: 'Pig',
        last_nom: 'Bodine',
        offerApplicable: 'FALSE',
        price: 100
      },
      {
        first_nom: 'Pirate',
        last_nom: 'Prentice',
        offerApplicable: 'TRUE',
        price: 50
      },
      {
        first_nom: 'nithesh',
        last_nom: 'Bodine',
        offerApplicable: 'FALSE',
        price: 40
      },
      {
        first_nom: 'sumeet',
        last_nom: 'Prentice',
        offerApplicable: 'TRUE',
        price: 40
      },
      {
        first_nom: 'mahesh',
        last_nom: 'Bodine',
        offerApplicable: 'FALSE',
        price: 40
      },
      {
        first_nom: 'jitendra',
        last_nom: 'Prentice',
        offerApplicable: 'TRUE',
        price: 101
      }
    ];
    
    
    console.log(objs.sort(function compare(a,b) {
      if (a.offerApplicable == 'FALSE' && b.offerApplicable == 'TRUE')
        return 1;
      else if(a.offerApplicable == b.offerApplicable == 'TRUE')
         return a.price > b.price
      else if(a.offerApplicable == b.offerApplicable)
        return a.price > b.price
    }));

    这将按offerApplicable 排序,然后按price

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 2017-02-23
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多