根据值对对象数组进行排序

时间:2019-08-16 19:03:08

标签: javascript

我有这个对象数组:

const array =[ 
  { a: 'good car' },
  { a: 'good car1' },
  { a: 'good car2' },
  { a: 'good car3' },
  { a: 'good car4' },
  { b: 'good car1' } 
];

除领带外,我需要通过值对它进行排序。在平局的情况下,key用于打破平局。我搜索了很多但无法使用答案,因为我的对象中的键不相同,并且在领带(值相同)的情况下,我也无法处理。 有什么建议吗?

4 个答案:

答案 0 :(得分:4)

您可以获取条目,选择第一个条目并将其解构为键和值,然后将其用于另一个对象,然后返回链式排序值。

var array = [{ v21: 'sad sdd' }, { aaa: 'sad sdd' }, { v11: 'r err rr' }, { hf32: 'erwwer fgh' }, { z3f2: 'agfrr vbbar' }, { t142: 'gggoog  anfa' }, { u23: 'fa handle err' }];

array.sort((a, b) => {
    var [keyA, valueA] = Object.entries(a)[0],
        [keyB, valueB] = Object.entries(b)[0];
        
    return valueA.localeCompare(valueB) || keyA.localeCompare(keyB);
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

使用es6中的<pages validateRequest="false" />

尝试此代码:

sort

答案 2 :(得分:0)

您可以尝试以下代码:

const array =[ 
  { v21: 'sad sdd' },
  { v11: 'r err rr' },
  { hf32: 'erwwer fgh' },
  { z3f2: 'agfrr vbbar' },
  { z3f1: 'agfrr vbbar' },
  { t142: 'gggoog  anfa' },
  { u23: 'fa handle err' } 
];
array.sort((a,b) => {
      if (a[Object.keys(a)[0]] === b[Object.keys(b)[0]]) {
          return Object.keys(a)[0].localeCompare(Object.keys(b)[0]);
      }
      return a[Object.keys(a)[0]].localeCompare(b[Object.keys(b)[0]]);
});
console.log(array);

答案 3 :(得分:0)

不使用比较功能的变体:

const array = [
  { v21: "sad sdd" },
  { v11: "r err rr" },
  { hf32: "erwwer fgh" },
  { z3f2: "sad sdd" },
  { t142: "gggoog  anfa" },
  { u23: "fa handle err" }
];

const result = array
  .map(item => ({
    key: Object.keys(item)[0],
    value: item[Object.keys(item)[0]]
  }))
  .map(item => `${item.value}:${item.key}`)
  .sort()
  .map(item => item.split(":"))
  .map(item => ({ [item[1]]: item[0] }));

console.log(result);

如果希望在值中使用,可能必须使用其他一些连接字符代替“:”