簡體   English   中英

根據for循環中的值對嵌套的Json對象進行排序?

[英]Sort Nested Json Object based on value in for loop?

希望有人能在這里幫助我,或者至少為我指明正確的方向。 我花了幾個小時試圖解決這個問題,但我迷路了。

下面的代碼只是模擬,我的實際 json 是使用 jquery 通過 AJAX 返回的。 我的問題不是排序,而是對嵌套的 json 對象進行排序。

我正在嘗試根據成本對 json 輸出進行排序。 (從最低成本到最高成本),我的嘗試失敗了,我無法對此進行排序。 我不斷收到“排序”未定義的信息。

任何幫助將不勝感激,或者您是否可以指出我在這里做錯了什么。

 var json = '{"shipping_method":{"ups":{"title":"United Parcel Service","quote":{"12":{"code":"ups.12","title":"UPS 3 Day Select","cost":117.3,"tax_class_id":"0","text":"$117.30"},"13":{"code":"ups.13","title":"UPS Next Day Air Saver","cost":242.52,"tax_class_id":"0","text":"$242.52"},"14":{"code":"ups.14","title":"UPS Next Day Air Early AM","cost":279.95,"tax_class_id":"0","text":"$279.95"},"03":{"code":"ups.03","title":"UPS Ground","cost":54.62,"tax_class_id":"0","text":"$54.62"},"02":{"code":"ups.02","title":"UPS 2nd Day Air","cost":177.31,"tax_class_id":"0","text":"$177.31"},"01":{"code":"ups.01","title":"UPS Next Day Air","cost":248.08,"tax_class_id":"0","text":"$248.08"}},"sort_order":"","error":""}}}'; /* This doesnt work and returns undefined. json["shipping_method"]["quote"].sort(function(a, b) { return a['cost'] > b['cost']; }); // I found this example, but also didn't work. custSort = (prop1, prop2 = null, direction = 'asc') => (e1, e2) => { const a = prop2 ? e1[prop1][prop2] : e1[prop1], b = prop2 ? e2[prop1][prop2] : e2[prop1], sortOrder = direction === "asc" ? 1 : -1 return (a < b) ? -sortOrder : (a > b) ? //sortOrder : 0; }; json.sort(custSort("quote", "cost", "desc"));*/ json = JSON.parse(json); for (var i in json["shipping_method"]) { // EDIT:: I want the sorting to occur here if possible. for (j in json["shipping_method"][i]["quote"]) { //EDIT:: I want to keep this for loop, but with the results sorted by cost console.log(json["shipping_method"][i]["quote"][j]["cost"]); } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

將對象轉換為有序數組

對象可以展平,以便父鍵包含在深度對象中,因為它被迭代了。 一個早期的例子可以在這個答案編輯歷史中找到。 它已被刪除,因為諸如引用 ID 之類的信息被認為不重要。

下面是一個使用Object.values的例子,它遍歷一個對象並只返回該對象值的數組(丟棄鍵)。 然后可以按預期對值進行排序,按cost

 const json = JSON.parse(getData()); for (let method in json["shipping_method"]) { // cache let quotes = json['shipping_method'][method]['quote'] // convert object to array and sort let sortedQuotes = Object.values(quotes).sort((a, b)=>a.cost-b.cost); console.log(sortedQuotes) } /* Dummy Data */ function getData() { return '{"shipping_method":{"ups":{"title":"United Parcel Service","quote":{"12":{"code":"ups.12","title":"UPS 3 Day Select","cost":117.3,"tax_class_id":"0","text":"$117.30"},"13":{"code":"ups.13","title":"UPS Next Day Air Saver","cost":242.52,"tax_class_id":"0","text":"$242.52"},"14":{"code":"ups.14","title":"UPS Next Day Air Early AM","cost":279.95,"tax_class_id":"0","text":"$279.95"},"03":{"code":"ups.03","title":"UPS Ground","cost":54.62,"tax_class_id":"0","text":"$54.62"},"02":{"code":"ups.02","title":"UPS 2nd Day Air","cost":177.31,"tax_class_id":"0","text":"$177.31"},"01":{"code":"ups.01","title":"UPS Next Day Air","cost":248.08,"tax_class_id":"0","text":"$248.08"}},"sort_order":"","error":""}}}'; }
 .as-console-wrapper { max-height: 100vh !important; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

每種運輸方式的成本報價

這假設需要引用 ID(可能放在一行中); 否則,這可以使用Object.values代替Object.entries (以及其他更改)來簡化。

忽略output函數在做什么。 這是一個簡單的例子,它不能確保正確的單元順序,並且有許多其他限制和漏洞。 僅用於證明排序后原始quote數據仍然可用。

 const data = JSON.parse(getData()); for (let method in data.shipping_method) { output({row: method}, {class:'capitalize'}) // cache let quotes = data.shipping_method[method].quote let sortContent = Object.entries(quotes); let sortedQuotes = sortContent.sort((a,b)=>a[1].cost-b[1].cost).map(i=>i[0]); for (let quoteId of sortedQuotes){ let quoteInfo = quotes[quoteId]; output({cell: quoteInfo}) } } /* Dummy Data */ function getData() { return '{"shipping_method":{"ups":{"title":"United Parcel Service","quote":{"12":{"code":"ups.12","title":"UPS 3 Day Select","cost":117.3,"tax_class_id":"0","text":"$117.30"},"13":{"code":"ups.13","title":"UPS Next Day Air Saver","cost":242.52,"tax_class_id":"0","text":"$242.52"},"14":{"code":"ups.14","title":"UPS Next Day Air Early AM","cost":279.95,"tax_class_id":"0","text":"$279.95"},"03":{"code":"ups.03","title":"UPS Ground","cost":54.62,"tax_class_id":"0","text":"$54.62"},"02":{"code":"ups.02","title":"UPS 2nd Day Air","cost":177.31,"tax_class_id":"0","text":"$177.31"},"01":{"code":"ups.01","title":"UPS Next Day Air","cost":248.08,"tax_class_id":"0","text":"$248.08"}},"sort_order":"","error":""}}}'; } /* Really simple output for demo purpose */ function output(data, options={}){ if ('row' in data){ let $col = $('<td></td>', options).html(data.row) let $row = $('<tr></tr>').append($col); $('tbody').append( $row ) } else if ('cell' in data){ let $row = $('<tr></tr>') for( let key in data.cell ){ let $col = $('<td></td>', options).html(data.cell[key]) $row.append($col) } $('tbody').append( $row ) } }
 .capitalize { text-transform: uppercase; } td { min-width: 5rem; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <table> <thead></thead> <tbody></tbody> </table>

您的對象可以具有任意數量的屬性,並且您可以選擇按您想要的任何對象屬性(數字或字符串)排序,如果您將對象放在數組中。

var item = JSON.parse(json).shipping_method.ups.quote;

使用Object.values()獲取 JSON 對象的值數組,然后使用slice()方法復制 JSON 對象數組,而不僅僅是引用。

var byCost = Object.values(item).slice(0);

最后,您可以對該對象數組使用 sort 函數。

byCost.sort(function(a,b) {return a.cost - b.cost});

 var json = '{"shipping_method":{"ups":{"title":"United Parcel Service","quote":{"12":{"code":"ups.12","title":"UPS 3 Day Select","cost":117.3,"tax_class_id":"0","text":"$117.30"},"13":{"code":"ups.13","title":"UPS Next Day Air Saver","cost":242.52,"tax_class_id":"0","text":"$242.52"},"14":{"code":"ups.14","title":"UPS Next Day Air Early AM","cost":279.95,"tax_class_id":"0","text":"$279.95"},"03":{"code":"ups.03","title":"UPS Ground","cost":54.62,"tax_class_id":"0","text":"$54.62"},"02":{"code":"ups.02","title":"UPS 2nd Day Air","cost":177.31,"tax_class_id":"0","text":"$177.31"},"01":{"code":"ups.01","title":"UPS Next Day Air","cost":248.08,"tax_class_id":"0","text":"$248.08"}},"sort_order":"","error":""}}}'; var item = JSON.parse(json).shipping_method.ups.quote; var byCost = Object.values(item).slice(0); byCost.sort(function(a,b) {return a.cost - b.cost}); console.log(byCost)

您似乎沒有在這里訪問正確的路徑...查看您發布的 JSON,您應該嘗試對shipping_method.ups.quote進行排序,另外值得注意的是shipping_method.ups.quote是一個對象,必須進行轉換到一個 Array 來調用.sort 因為這個方法存在於 Array 原型上。

這可以通過多種方式完成,但Object.values()就是這樣一種方式。

您可以嘗試以下方法,

json = JSON.parse(json);
  let item = json.shipping_method.ups.quote,
    temp = [];
  for (let key in item) {
    temp.push(item[key]);
  }
  temp.sort((x, y) => x.cost - y.cost);
  json.shipping_method.ups.quote = temp;

將您的對象轉換為數組然后排序;

正如我所看到的,你的問題是用成本對對象進行排序,因為它們的鍵應該保持不變,

試試這個,

var json = '{"shipping_method":{"ups":{"title":"United Parcel Service","quote":{"12":{"code":"ups.12","title":"UPS 3 Day Select","cost":117.3,"tax_class_id":"0","text":"$117.30"},"13":{"code":"ups.13","title":"UPS Next Day Air Saver","cost":242.52,"tax_class_id":"0","text":"$242.52"},"14":{"code":"ups.14","title":"UPS Next Day Air Early A.M.","cost":279.95,"tax_class_id":"0","text":"$279.95"},"03":{"code":"ups.03","title":"UPS Ground","cost":54.62,"tax_class_id":"0","text":"$54.62"},"02":{"code":"ups.02","title":"UPS 2nd Day Air","cost":177.31,"tax_class_id":"0","text":"$177.31"},"01":{"code":"ups.01","title":"UPS Next Day Air","cost":248.08,"tax_class_id":"0","text":"$248.08"}},"sort_order":"","error":""}}}';

var json = JSON.parse(json);
let data = []
for(var i in json.shipping_method.ups.quote){
    data.push(json.shipping_method.ups.quote[i])
    data.sort((a,b) => a.cost - b.cost);
}

這會像以前一樣再次創建這些密鑰

let final = {} ;
data.forEach(el => final[el.code.split('.')[1]] = el);

最后用最新的排序報價更新報價:

json.shipping_method.ups.quote = final;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM