按键数排序对象数组(JavaScript)

时间:2016-08-16 18:48:59

标签: javascript arrays sorting object

大家好我有一个对象数组(其中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": {}}]

3 个答案:

答案 0 :(得分:2)

解决方案1 ​​

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)

解决方案2

如果您的数据是嵌套的,则子数据应附加到已知名称的属性

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)

降低复杂性是投资未来的一种方式。一旦你在自己的程序中包含了一些复杂性,它将在以后随时为您服务。较小的程序也更容易测试。

上述ascComparatorproplencompkeylen的每个程序都有立即明显的意图。您可以随时重新访问这些内容并轻松理解它们。使用它们的结果是,它使您的类型更易于读/写。

答案 1 :(得分:1)

对于您的数据结构,您可以像这样使用sort()

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:-1)

尝试

arrayOfObjects.sort(function(a, b) {
    return Object.keys(a).length > Object.keys(b).length ? -1 : 1;
});