对象数组的特殊排序

时间:2017-07-17 18:55:44

标签: javascript arrays sorting lodash

所以有很多关于排序的帖子:

var arr = [{a: 1}, {b: 2}]按字母顺序排列,但是如果你有类似var arr = [{a: 100}, {a: 50}]的内容,那么我想要的是然后说“哦,你们是一样的吗?让我们按价值排序(这将永远是是一个数字。)

我不确定如何使用lodash或任何其他类似的JavaScript方式。

最终结果应该是:

[{b: 2}, {a: 1}] // Keys are different (alphabetical)
// or:
[{a: 50}, {a: 100}] // Keys are the same (lowest to highest)

我在堆栈溢出时看到的所有内容都变得快速混乱(代码明智),我在思考,在lodash上有排序方法,但是如何根据情况实现我想要的东西?

有什么想法吗?

有人提出了一个很好的问题,还有更多的钥匙吗?它们只是ab

在任何给定时间,这个数组中只有两个对象,是的,键只能是字符串,在这种情况下,字符串可以是任何东西,猫,狗,鼠标,苹果,香蕉......什么都有。

价值只会是数字。

清除空气

如果键匹配,则仅按值对数组进行排序,如果键不匹配,则仅按键对数组进行排序。此数组中只有两个对象。为误解道歉。

3 个答案:

答案 0 :(得分:1)

如果您的对象中始终有一个属性,您可以先使用keylocaleCompare排序,然后按该属性的值排序。



var arr = [{b: 2}, {b: 10}, {a: 1}, {c: 1}, {a: 20}]

arr.sort(function(a, b) {
  var kA = Object.keys(a)[0]
  var kB = Object.keys(b)[0]
  return kA.localeCompare(kB) ||  a[kA] - b[kB] 
})

console.log(arr)




在排序之前,您可以创建一系列唯一键,您可以通过检查长度是否为>来检查所有对象是否具有相同的键。 1并在sort函数中使用它。



var arr = [{b: 10}, {b: 2}, {a: 1}, {c: 1}, {a: 20}, {b: 22}]
var arr2 = [{a: 10}, {a: 2}, {a: 1}, {a: 22}]


function customSort(data) {
  var keys = [...new Set([].concat(...data.map(e => Object.keys(e))))]

  data.sort(function(a, b) {
    var kA = Object.keys(a)[0]
    var kB = Object.keys(b)[0]

    return keys.length > 1 ? kA.localeCompare(kB) : a[kA] - b[kB]
  })

  return data;
}

console.log(customSort(arr))
console.log(customSort(arr2))




答案 1 :(得分:1)

您只能使用一个函数来执行两种类型的排序(适用于您的情况,其中您只有一个包含两个项目的数组,但它对于数组长度是完全通用的):



var arr1 = [{a: 30}, {a: 2}];
var arr2 = [{b: 30}, {a: 2}];

function sortArr(arr) {
  return arr.sort((a, b) => {
    var aKey = Object.keys(a)[0];
    var bKey = Object.keys(b)[0];

    return (aKey !== bKey) ? aKey.localeCompare(bKey) : a[aKey] - b[bKey];
  });
}

var sortedArr1 = sortArr(arr1);
var sortedArr2 = sortArr(arr2);

console.log(sortedArr1);
console.log(sortedArr2);




答案 2 :(得分:0)

var arr = [{b: 2}, {a: 1}, {b: 1}, {a: 100}, {a: 20}];

arr.sort(function(a, b) {
  var aKey = a.hasOwnProperty("a")? "a": "b",  // get the first object key (if it has the property "a" then its key is "a", otherwise it's "b")
      bKey = b.hasOwnProperty("a")? "a": "b";  // same for the second object
      
  return aKey === bKey?                        // if the keys are equal
           a[aKey] - b[aKey]:                  // then sort the two objects by the value of that key (stored in either aKey or bKey)
           aKey.localeCompare(bKey);           // otherwise sort by the strings aKey and bKey (the keys of the two objects)
});

console.log(arr);