我有一个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"
}
}
答案 0 :(得分:3)
有三个问题阻止您完成此任务。
您将不得不抓取对象和子对象以提取所需的键值。
此外,您无法对对象的对象进行排序。您可以使用数组来完成此操作。我将您的结构转换为对象数组。
在删除"airline"
值之后的那些迷路逗号之前,您将无法正确解析JSON。请参阅文本区域元素中的有效JSON。
因此,在开始转换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.parse
和JSON.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; }