按键排序Javascript对象,然后按命名属性排序

时间:2017-06-18 03:08:46

标签: javascript arrays sorting javascript-objects

我无法通过KEY(DESC)对以下对象进行排序。 然后,按" notesList.id"对每个项目进行排序。财产(DESC)。

预期订单

  • " 2017/04/17#34;
  • " 2017/03/14#34;
  • " 2017/02/30#34;

然后,对于" 2017/04/17" notesList项目,这是预期订单

  • ID:57
  • ID:48
  • ID:12

JS对象

var myNotes = {
  "customNotes":{
    "2017/04/17":{
      "concernedDate":"2017/04/17",
      "notesList":[
        {
          "id":48,
          "title":"Title 48"
        },
        {
          "id":12,
          "title":"Title 12"
        },
        {
          "id":57,
          "title":"Title 57"
        }
      ]
    },
    "2017/02/30":{
      "concernedDate":"2017/02/30",
      "notesList":[
      {
        "id":92,
        "title":"Title 92"
      }
      ]
    },
    "2017/03/14":{
      "concernedDate":"2017/03/14",
      "notesList":[
      {
        "id":92,
        "title":"Title 92"
      }
      ]
    }
  }
}

剧本

//Convert the OBJECT to an ARRAY
var tmpArr = Object.keys(myNotes.customNotes);

//Sort (Not working)
tmpArr.sort((a, b) => a > b ? a : b);

//Convert back the ARRAY to an OBJECT
Object.keys(myNotes.customNotes).sort((a, b) => a > b ? a : b).map(k => myNotes.customNotes[k]);

我错过了什么?我非常感谢你

3 个答案:

答案 0 :(得分:1)

您可以使用thenBy.js

喜欢这个

data.sort(
    firstBy(function (v1, v2) { return v1.name.length - v2.name.length; })
    .thenBy(function (v1, v2) { return v1.population - v2.population; })
    .thenBy(function (v1, v2) { return v1.id - v2.id; })
);

您还可以使用此库按属性名称进行排序

喜欢这个

data.sort(
    firstBy(function (v) { return v.name.length; })
    .thenBy("population")
    .thenBy("id")
);

答案 1 :(得分:1)

您的sort函数应返回零,正数或负数。你只是返回值。另请注意,这会将customNotes转换为数组,因为无法对对象进行排序。如果您不希望发生这种情况,可以在customNotes中使用已排序的键数组维护另一个键,并使用此数组在customNotes中查找值。另一种方法是使用新的Map对象。 Map支持排序的密钥。

试试这个:



var myNotes = {
  "customNotes":{
    "2017/04/17":{
      "concernedDate":"2017/04/17",
      "notesList":[
        {
          "id":48,
          "title":"Title 48"
        },
        {
          "id":12,
          "title":"Title 12"
        },
        {
          "id":57,
          "title":"Title 57"
        }
      ]
    },
    "2017/02/30":{
      "concernedDate":"2017/02/30",
      "notesList":[
      {
        "id":92,
        "title":"Title 92"
      }
      ]
    },
    "2017/03/14":{
      "concernedDate":"2017/03/14",
      "notesList":[
      {
        "id":92,
        "title":"Title 92"
      }
      ]
    }
  }
}

var myNewNotes = {};
myNewNotes.customNotes = Object.keys(myNotes.customNotes).sort((a, b) => {
  if (a < b) return -1
  else if (a > b) return 1;
  else return 0;
}).map(key => sorted(myNotes.customNotes[key]));

function sorted(note) {
  note.notesList = note.notesList.sort((a, b) => {
    if (a.id < b.id) return -1;
    else if (a.id > b.id) return 1;
    else return 0;
  })
  return note;
}

console.log(myNewNotes)
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我在代码中发现了一些看似不合适的事情。

  1. tmpArr.sort((a, b) => a > b ? a : b);返回tmpArr的排序版本。它不会修改myNotes对象。
  2. Object.keys(myNotes.customNotes).sort(...将从myNotes.customNotes返回一个对象数组,而不是像myQuotes那样具有与myNotes相同结构的对象。
  3. 在上面的代码中,您没有对notesList进行排序。
  4. 假设您想获得一个数组,您只需要修复排序函数,并在map函数中对notesList进行排序。所以你的代码应该是这样的:

    var myNotes={customNotes:{"2017/04/17":{concernedDate:"2017/04/17",notesList:[{id:48,title:"Title 48"},{id:12,title:"Title 12"},{id:57,title:"Title 57"}]},"2017/02/30":{concernedDate:"2017/02/30",notesList:[{id:92,title:"Title 92"}]},"2017/03/14":{concernedDate:"2017/03/14",notesList:[{id:92,title:"Title 92"}]}}};
    
    var res = Object.keys(myNotes.customNotes)
      .sort((a, b) => a < b)
      .map(k => {   
        let currNote = myNotes.customNotes[k];
        currNote.notesList.sort((a, b) => a.id < b.id)
        return myNotes.customNotes[k];
    });
    
    console.log(res);

    但是,如果你打算保留myNotes的结构,我会建议你使用reduce函数。请参阅下面的代码:

    var myNotes={customNotes:{"2017/04/17":{concernedDate:"2017/04/17",notesList:[{id:48,title:"Title 48"},{id:12,title:"Title 12"},{id:57,title:"Title 57"}]},"2017/02/30":{concernedDate:"2017/02/30",notesList:[{id:92,title:"Title 92"}]},"2017/03/14":{concernedDate:"2017/03/14",notesList:[{id:92,title:"Title 92"}]}}};
    
    // MY SOLUTION
    var sortedNotes = Object.keys(myNotes.customNotes)
      .sort((a, b) => a < b)
      .reduce((acc, val, _, arr) => { 
        acc[val] = myNotes.customNotes[val];
        acc[val].notesList.sort((a, b) => a.id < b.id);
        return acc;  
    },{});
    
    console.log(sortedNotes);