大家好我有一个对象数组(其中20个),我已经用这种格式放置一个Angular Project中的列(注意对象中有对象)。我希望按对象排序大多数键(在数组中的每个对象内),对象在数组中的对象内部使用最少的数字键,这样当它们以列显示时,它最有意义。
我改变了一个导航栏变量,用于可点击的高级搜索。感谢您的帮助,因为这是我作为新开发人员的第一个大项目。
var clickableFilters = [
{"State": {
"0": [{value: "liquid"}, {count: 30}]
}
},
{"Country": {
"0": [{value: "USA"}, {count: 50}]
"1": [{value: "Nigeria"}, {count: 90}]
}
},
{"Color": {
"0": [{value: "blue"}, {count: 30}]
"1": [{value: "purple"}, {count: 50}]
"2": [{value: "green"}, {count: 100}]
}
}
]

如何按键数(内部对象中的键)对对象进行排序,以便最终(在JavaScript中)
[{"Color": {}}, {"Country": {}}, {"State": {}}]
答案 0 :(得分:2)
为Array.prototype.sort
使用自定义比较器可以满足您的需要
let data = [{a:1,b:2,c:3}, {a:1}, {a:1,b:2,c:3,d:4}, {a:1,b:2}]
data.sort((a,b) => Object.keys(a).length - Object.keys(b).length)
console.log(data)
如果您的数据是嵌套的,则子数据应附加到已知名称的属性
let data = [
{foo: 'W', bar: {a:1,b:2,c:3}},
{foo: 'X', bar: {a:1}},
{foo: 'Y', bar: {a:1,b:2,c:3,d:4}},
{foo: 'Z', bar: {a:1,b:2}}
]
let keyToSort = "bar";
data.sort((a,b) => Object.keys(a[keyToSort]).length - Object.keys(b[keyToSort]).length)
console.log(data)
另一方面,如果保证总是只有一个键(可能带有未知/动态名称),你可以写
Object.keys(a[Object.keys(a)[0]]).length
然而,这显然非常难看并且容易出错(如果它 有更多的键 - 或者根本没有键)。如果您可以控制数据结构,那么您应该考虑重构它,因为只有一个键的Object没有多大意义 - 您也可以只删除一个嵌套级别。
你应该养成与复杂性作斗争的习惯 - 只要它顽固的头脑,抓住你的员工,并施加同样顽固的力量。
上面的第一个解决方案似乎有些可控,但第二个解决方案开始变得相当厚实。如果您将解决方案分解为可重复使用的微小部件,则可以相对轻松地保持复杂性。
const ascComparator = (a,b) => a < b ? -1 : a > b ? 1 : 0
// use this if you want to sort data descending instead of ascending
const descComparator = (a,b) => ascComparator(b,a)
const prop = x => y => y[x]
const len = prop('length')
const comp = f => g => x => f (g (x))
const keylen = comp (len) (Object.keys)
let data = [
{foo: 'W', bar: {a:1,b:2,c:3}},
{foo: 'X', bar: {a:1}},
{foo: 'Y', bar: {a:1,b:2,c:3,d:4}},
{foo: 'Z', bar: {a:1,b:2}}
]
// same as solution #2 but much more descriptive
// "sort ascending using keylen of a.bar compared to keylen of b.bar"
data.sort((a,b) => ascComparator(keylen(a.bar), keylen(b.bar)))
console.log(data)
降低复杂性是投资未来的一种方式。一旦你在自己的程序中包含了一些复杂性,它将在以后随时为您服务。较小的程序也更容易测试。
上述ascComparator
,prop
,len
,comp
和keylen
的每个程序都有立即明显的意图。您可以随时重新访问这些内容并轻松理解它们。使用它们的结果是,它使您的类型更易于读/写。
答案 1 :(得分:1)
对于您的数据结构,您可以像这样使用sort()
。
var arrayOfObjects = [
{"least#OfKeysObject": {
key1: 'value',
}
},
{"secondMost#OfKeysObj": {
key1: 'value',
key2: 'value'
}
},
{"most#OfKeysObj": {
key1: 'value',
key2: 'value',
key3: 'value'
}
}
];
var result = arrayOfObjects.sort(function(a, b) {
return Object.keys(b[Object.keys(b)[0]]).length - Object.keys(a[Object.keys(a)[0]]).length;
});
console.log(result)
&#13;
答案 2 :(得分:-1)
尝试
arrayOfObjects.sort(function(a, b) {
return Object.keys(a).length > Object.keys(b).length ? -1 : 1;
});