鍍金池/ 問(wèn)答/Java  Linux  HTML/ 如何用js對(duì)json數(shù)據(jù)進(jìn)行二次排序?

如何用js對(duì)json數(shù)據(jù)進(jìn)行二次排序?

比如:

a = {1: [4, 7], 2: [2, 6], 3: [4, 9], 4: [1, 8], 5: [5, 5]}

先根據(jù) value 的第一個(gè)參數(shù)排序,

結(jié)果如下:

{5: [5, 5], 1: [4, 7], 3: [4, 9], 2: [2, 6], 4: [1, 8]}
發(fā)現(xiàn)有相同,再根據(jù)第二個(gè)參數(shù)進(jìn)行內(nèi)部排序。
結(jié)果如下:

{5: [5, 5], 3: [4, 9], 1: [4, 7], 2: [2, 6], 4: [1, 8]}
這個(gè)就不知道怎么解決了?

ps:用python和php都比較簡(jiǎn)單的解決,但是js似乎困難

回答
編輯回答
法克魷

你這個(gè)題目有點(diǎn)問(wèn)題吧,你對(duì)一個(gè)對(duì)象的鍵排序有啥意義,鍵值對(duì)的訪問(wèn)時(shí)間復(fù)雜度就是O(1)的,你如果是數(shù)組的話我可以理解。

var a = {1: [4, 7], 2: [2, 6], 3: [4, 9], 4: [1, 8], 5: [5, 5]}
var array = []
var result = {}
var i = 0

Object.keys(a).forEach(function(key){
  array.push({
    key: key,
    value: a[key]
  })
})
console.log(array)

array = array.sort(function(a,b) {
  if (a.value[0] === b.value[0]) {
    return a.value[1] - b.value[1]
  }
  return a.value[0] - b.value[0]
})

console.log(array)

for (var i = 0; i < array.length; i++) {
  result[array[i].key] = array[i].value
}


console.log(a)
console.log(result)
2017年1月26日 04:50
編輯回答
落殤
let a = { 1: [4, 7], 2: [2, 6], 3: [4, 9], 4: [1, 8], 5: [5, 5] };

let arr = [];

Object.getOwnPropertyNames(a).forEach((attr, index) => {
    let obj = {};
    obj[attr] = JSON.parse(JSON.stringify(a[attr]));
    arr.push(obj);
});
// 上面為改變數(shù)據(jù)結(jié)構(gòu),對(duì)象轉(zhuǎn)數(shù)組;
function compare(a, b) {
    let valueA = a[Object.keys(a)[0]],
        valueB = b[Object.keys(b)[0]];
    if (valueA[0] < valueB[0]) {
        return -1;
    } else if (valueA[0] > valueB[0]) {
        return 1;
    } else {
        return valueA[1] < valueB[1] ? -1 : 1;
    }
}

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

這個(gè)數(shù)據(jù)結(jié)構(gòu)有問(wèn)題,上面代碼的1/3就是用來(lái)改數(shù)據(jù)結(jié)構(gòu)的,一般數(shù)據(jù)結(jié)構(gòu)會(huì)是這樣子:

如果不確定第一個(gè)鍵是否是數(shù)字的話:

[ { '1': [ 4, 7 ] },
  { '2': [ 2, 6 ] },
  { '3': [ 4, 9 ] },
  { '4': [ 1, 8 ] },
  { '5': [ 5, 5 ] } ]

如果第一個(gè)鍵肯定是數(shù)字:

[ [ 4, 7 ] 
  [ 2, 6 ] 
  [ 4, 9 ] 
  [ 1, 8 ] 
  [ 5, 5 ] ]
2017年8月9日 08:45