[英]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.