简体   繁体   English

如果属性存在,则对对象数组进行排序

[英]Sort an array of objects if property exists

I have an array of objects. 我有一个对象数组。 Out of each of these objects onle few of them have a property and I want to sort the array putting those objects at top which have that property. 在每个这些对象中,只有几个具有属性,我想对数组进行排序,将具有该属性的那些对象放在顶部。

Ex - 前-

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

Sorted by key1 按key1排序

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

I have tried below approach- 我尝试了以下方法-

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;
            }

Not exactly but I see discrepancy from the above approach. 不完全是,但是我发现上述方法存在差异。 For a array bigger length, some of the objects which have key1 are not moved to top. 对于更大长度的数组,某些具有key1的对象不会移到顶部。 Can this be done by internal sort method of javascript? 可以通过javascript的内部sort方法来完成此操作吗? If yes, how will the custom function compare ? 如果是,自定义函数将如何比较?

Can only support ES5 methods. 仅支持ES5方法。

Can this be done by internal sort method of javascript 可以通过javascript的内部排序方法来完成吗

Yes: Simply prefer the entry that has the property: 是:只需选择具有以下属性的条目:

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

Live Example: 现场示例:

 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); 

If you also want to sort by that property's value: 如果您还想按该属性的值排序:

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;
});

Live Example: 现场示例:

 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')));

Here is a working snippet that gives your requested result and is easily extended. 这是一个工作片段,可以提供您所需的结果,并且可以轻松扩展。 It uses the native array sort . 它使用本机数组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 https://github.com/arraybrain/arraybrain

for complex array stuff, you can use it 对于复杂的数组内容,您可以使用它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM