所以有很多关于排序的帖子:
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上有排序方法,但是如何根据情况实现我想要的东西?
有什么想法吗?
有人提出了一个很好的问题,还有更多的钥匙吗?它们只是a
和b
?
在任何给定时间,这个数组中只有两个对象,是的,键只能是字符串,在这种情况下,字符串可以是任何东西,猫,狗,鼠标,苹果,香蕉......什么都有。
价值只会是数字。
清除空气
如果键匹配,则仅按值对数组进行排序,如果键不匹配,则仅按键对数组进行排序。此数组中只有两个对象。为误解道歉。
答案 0 :(得分:1)
如果您的对象中始终有一个属性,您可以先使用key
按localeCompare
排序,然后按该属性的值排序。
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);