簡體   English   中英

如果屬性存在,則對對象數組進行排序

[英]Sort an array of objects if property exists

我有一個對象數組。 在每個這些對象中,只有幾個具有屬性,我想對數組進行排序,將具有該屬性的那些對象放在頂部。

前-

arr= [{key1: "obj1val1", key2 :"obj1val2"}, 
      {key2 :"obj2val2"}, 
      {key1: "obj3val3", key2 :"obj3val3"},
      {key2 :"obj4val1"},
      {key1: "obj5val1", key2 :"obj5val2"}
]

按key1排序

Expected Result - [{key1: "obj1val1", key2 :"obj1val2"}, 
                   {key1: "obj3val3", key2 :"obj3val3"},
                   {key1: "obj5val1", key2 :"obj5val2"}, 
                   {key2 :"obj2val2"}, 
                   {key2 :"obj4val1"}]

我嘗試了以下方法-

sort : function(arr) {
              var copyArr = arr.slice();
              var newArr = [];
              for(var i=0; i<arr.length; i++){
                if(arr[i].key1){
                  newArr.push(arr[i]);
                    copyArr.splice(i, 1);
                }
              }
              Array.prototype.push.apply(newArr, copyArr);
              return newArr;
            }

不完全是,但是我發現上述方法存在差異。 對於更大長度的數組,某些具有key1的對象不會移到頂部。 可以通過javascript的內部sort方法來完成此操作嗎? 如果是,自定義函數將如何比較?

僅支持ES5方法。

可以通過javascript的內部排序方法來完成嗎

是:只需選擇具有以下屬性的條目:

arr.sort(function(left, right) {
    return left.hasOwnProperty("key1") ? -1 : right.hasOwnProperty("key1") ? 1 : 0
});

現場示例:

 var arr = [ {key1: "obj1val1", key2 :"obj1val2"}, {key2 :"obj2val2"}, {key1: "obj3val3", key2 :"obj3val3"}, {key2 :"obj4val1"}, {key1: "obj5val1", key2 :"obj5val2"} ]; arr.sort(function(left, right) { return left.hasOwnProperty("key1") ? -1 : right.hasOwnProperty("key1") ? 1 : 0 }); console.log(arr); 

如果您還想按該屬性的值排序:

arr.sort(function(left, right) {
    var leftHas = left.hasOwnProperty("key1");
    var rightHas = right.hasOwnProperty("key1");
    if (leftHas && rightHas) {
      return left.key1.localeCompare(right.key1);
    }
    return leftHas ? -1 : rightHas ? 1 : 0;
});

現場示例:

 var arr = [ {key1: "obj1val1", key2 :"obj1val2"}, {key2 :"obj2val2"}, {key1: "obj3val3", key2 :"obj3val3"}, {key2 :"obj4val1"}, {key1: "obj5val1", key2 :"obj5val2"} ]; arr.sort(function(left, right) { var leftHas = left.hasOwnProperty("key1"); var rightHas = right.hasOwnProperty("key1"); if (leftHas && rightHas) { return left.key1.localeCompare(right.key1); } return leftHas ? -1 : rightHas ? 1 : 0; }); console.log(arr); 

您可以采用的一種靈活方式:

arr.filter(obj => obj.hasOwnProperty('key1')).concat(arr.filter(obj => !obj.hasOwnProperty('key1')));

這是一個工作片段,可以提供您所需的結果,並且可以輕松擴展。 它使用本機數組sort

 arr = [{ key1: "obj1val1", key2: "obj1val2" }, { key2: "obj2val2" }, { key1: "obj3val3", key2: "obj3val3" }, { key2: "obj4val1" }, { key1: "obj5val1", key2: "obj5val2" } ] const sorted = arr.sort((a, b) => { const k1 = a.key1 === undefined ? 0 : 1 const k2 = b.key1 === undefined ? 0 : 2 return k2- k1 }) console.log(sorted) 

https://github.com/arraybrain/arraybrain

對於復雜的數組內容,您可以使用它

暫無
暫無

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

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