如何在Javascript中按价格对此JSON对象进行排序?

时间:2016-12-16 18:31:49

标签: javascript arrays json sorting

我有一个JSON对象,我想根据价格从最小到最大排序。

{
 "BEY": {
  "1": {
    "price": 2280,
    "airline": "QR",
  },
  "2": {
    "price": 2108,
    "airline": "UA",
  }
 },
 "BKK": {
  "1": {
    "price": 2956,
    "airline": "QR",
  },
  "2": {
    "price": 1718,
    "airline": "WS",
  }
 }
}

我想重新格式化,以便钥匙是机票的价格。例如:

{ 
  1718: {
   "airline" : "WS",
   "IATA_Code" : "BKK"
  },
  2108: {
   "airline" : "UA",
   "IATA_Code" : "BEY"
  },
  2280: {
   "airline" : "QR",
   "IATA_Code" : "BEY"
  },
  2956: {
   "airline" : "QR",
   "IATA_Code" : "BKK"
  }
}

2 个答案:

答案 0 :(得分:3)

有三个问题阻止您完成此任务。

  1. 您将不得不抓取对象和子对象以提取所需的键值。

  2. 此外,您无法对对象的对象进行排序。您可以使用数组来完成此操作。我将您的结构转换为对象数组。

  3. 在删除"airline"值之后的那些迷路逗号之前,您将无法正确解析JSON。请参阅文本区域元素中的有效JSON。

  4. 因此,在开始转换JSON之前,您需要使用JSLint或其上构建的其他工具(JSHint等)并验证您的JSON是否正确;确实有效。

    var inputJSON = JSON.parse(document.getElementById('json-data').value);
    var outputJSON = JSON.stringify(convert(inputJSON), null, 4);
    
    document.body.innerHTML = '<pre>' + outputJSON + '</pre>';
    
    function convert(data) {
      var result = [];
      Object.keys(data).forEach(function(code) {
        Object.keys(data[code]).forEach(function(ticket) {
          var record = {
            'IATA_Code': code
          };
          Object.keys(data[code][ticket]).forEach(function(key) {
            record[key] = data[code][ticket][key];
          });
          result.push(record);
        });
      });
      return result.sort(function(a, b) {
        return a.price > b.price;
      });
    };
    <textarea id="json-data">
    {
      "BEY": {
        "1": { "price": 2280, "airline": "QR" },
        "2": { "price": 2108, "airline": "UA" }
      },
      "BKK": {
        "1": { "price": 2956, "airline": "QR" },
        "2": { "price": 1718, "airline": "WS" }
      }
    }
    </textarea>

    点击后的有效JSON结果: ▶上面的运行代码段 按钮。

    [{
      "IATA_Code": "BKK",
      "price": 1718,
      "airline": "WS"
    }, {
      "IATA_Code": "BEY",
      "price": 2108,
      "airline": "UA"
    }, {
      "IATA_Code": "BEY",
      "price": 2280,
      "airline": "QR"
    }, {
      "IATA_Code": "BKK",
      "price": 2956,
      "airline": "QR"
    }]
    

答案 1 :(得分:2)

当您有多个具有相同价格的条目时,您需要考虑输出数据结构的内容。由于您希望价格成为关键,这是不可能的,除非您预见为每个密钥存储一个数组:然后您可以以相同的价格存储一个,两个或更多条目。

为此您可以使用此ES6代码。如果您已经在JavaScript中使用“生活”对象,则当然不需要JSON.parseJSON.stringify方法:

var obj = JSON.parse(`{
 "BEY": {
  "1": {
    "price": 2280,
    "airline": "QR"
  },
  "2": {
    "price": 2108,
    "airline": "UA"
  }
 },
 "BKK": {
  "1": {
    "price": 2956,
    "airline": "QR"
  },
  "2": {
    "price": 1718,
    "airline": "WS"
  }
 }
}`);

var result = Object.keys(obj).reduce( (acc, IATA_Code) =>
    Object.keys(obj[IATA_Code]).reduce( (acc, i) => {
        let price = obj[IATA_Code][i].price;
        acc[price] = (acc[price] || []).concat({
            airline: obj[IATA_Code][i].airline, 
            IATA_Code 
        });
        return acc;
    }, acc),
{});

console.log(JSON.stringify(result, null, 2));
.as-console-wrapper { max-height: 100% !important; top: 0; }