在javascript中按字母顺序对数组及其对象键进行排序

时间:2018-06-01 06:51:21

标签: javascript arrays sorting

我有一个以下格式的数组。我按字母顺序对数组进行了排序。但是数组中的每个元素都存在一个子数组。我也想按字母顺序对它们进行排序。

var myObj = [
          {
          "name":"John",
          "items": [
              { "id":1, "car":"maruti" },  
              { "id":2, "car":"wolks" },
              { "id":3, "car":"bmw" }            
          ]},
          {
            "name":"Peter",
          "items": [
              { "id":4, "car":"alto" },  
              { "id":5, "car":"swift" },                          
          ]
       }
      ];

这是我用来对主数组进行排序的代码。在这里,我想对'项目进行排序。数组按字母顺序排列。

 myObj.sort(function(a, b){
        var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();          
        if (nameA < nameB) {
          return -1
        }
        if (nameA > nameB){
          return 1
        }
        return 0 
      }); 

3 个答案:

答案 0 :(得分:2)

sort函数其他中执行任何操作并不是对数组中的直接项进行排序感觉不对 - 我会迭代两次,一次排序myObj,以及对每个items属性进行排序。

您还可以使用localeCompare来简化代码:

&#13;
&#13;
var myObj=[{"name":"John","items":[{"id":1,"car":"maruti"},{"id":2,"car":"wolks"},{"id":3,"car":"bmw"}]},{"name":"Peter","items":[{"id":4,"car":"alto"},{"id":5,"car":"swift"},]}]
myObj.sort((a, b) => a.name.localeCompare(b.name));
myObj.forEach(({ items }) => items.sort((a, b) => a.car.localeCompare(b.car)));
console.log(myObj);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您需要遍历数组中的所有对象。您可以使用map函数并使用sort函数对每个项目列表进行排序。

&#13;
&#13;
var myObj = [
          {
          "name":"John",
          "items": [
              { "id":1, "car":"maruti" },  
              { "id":2, "car":"wolks" },
              { "id":3, "car":"bmw" }            
          ]},
          {
            "name":"Peter",
          "items": [
              { "id":4, "car":"alto" },  
              { "id":5, "car":"swift" },                          
          ]
       }
      ];
function sorting(a, b){
    // you can use just 
    // return a.car.localeCompare(b.car)  
    // reference CertainPerformance answer
    var nameA=a.car.toLowerCase(), nameB=b.car.toLowerCase();          
    if (nameA < nameB) {
      return -1
    }
    if (nameA > nameB){
      return 1
    }
    return 0 
}
myObj.forEach(obj => obj.items.sort(sorting))
console.log(myObj)
// myObj.map(obj => obj.items.sort(sorting)) // returns new array
// updated answer for useful comments.
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您需要迭代数组,然后对每个对象的items进行排序。

var myObj = [{"name":"John","items":[{"id":1,"car":"maruti"},{"id":2,"car":"wolks"},{"id":3,"car":"bmw"}]},{"name":"Peter","items":[{"id":4,"car":"alto"},{"id":5,"car":"swift"},]}];
      
myObj.forEach(({items}) => items.sort((a,b) => a.car.localeCompare(b.car)));
console.log(myObj);