如何根据对象的值的长度对其进行排序

时间:2020-09-27 21:53:53

标签: javascript

我有一个键(str):值(arr)对的对象。

const obj = {
   '1': []
   '2': ['a', 'b'],
   '3': [],
   '4': ['c']
}

我想按每个键在值中包含的元素数进行排序。

就像那样,

const obj = {
   '2': ['a', 'b'],
   '4': ['c']
   '1': []
   '3': [],
}

搜索后,我尝试了这种语法

const sortable = Object.fromEntries(
    Object.entries(obj).sort(([,a],[,b]) => b.length)
);

但这给我带来了不确定性。

有帮助吗?

编辑

对不起,键是String

更详细的示例

const obj = {
    '1.2.3': [1,2,3,4],
    'ABC12': [],
    'CAA11': [3,5],
    '4.4.1': [1,2,3],
}

const obj = {
    '1.2.3': [1,2,3,4],
    '4.4.1': [1,2,3],
    'CAA11': [3,5],
    'ABC12': [],
}

3 个答案:

答案 0 :(得分:1)

您正在寻找的最有可能是

Object.entries(obj).sort(([, a], [, b]) => b.length - a.length);

但是,上面代码的输出是一个数组,该数组再次由对象的可枚举属性[key,value]对组成。无法在对象本身内部对对象的键进行排序。

答案 1 :(得分:0)

假设所有键都是整数

Object.keys(obj).sort((a,b)=>a-b).reduce((acc, key)=>((acc[key]=obj[key]), acc),{});

使用已排序的键返回新对象

编辑: 根据值长度(数组长度)排序;

Object.keys(obj).sort((a,b)=>obj[b].length - obj[a].length)
    .reduce((acc, key)=>((acc[key]=obj[key]), acc),{});

const obj = {
    '1.2.3': [1,2,3,4],
    'ABC12': [],
    'CAA11': [3,5],
    '4.4.1': [1,2,3],
}
const res = Object.keys(obj)
                  .sort((a,b)=>obj[b].length - obj[a].length)
                  .reduce((acc, key)=>((acc[key]=obj[key]), acc),{});
console.log(res);

答案 2 :(得分:0)

let obj = {
   '1.2.3': [1,2,3,4],
  'ABC12': [],
  'CAA11': [3,5],
  '4.4.1': [1,2,3],
}
console.log(obj);
let entries = Object.entries(obj).sort((a,b) => { return b[1].length - a[1].length;});
let tempObj = {};
for(let i = 0; i < entries.length; i++){
  tempObj[entries[i][0]] = entries[i][1]; 
}
obj = tempObj;
console.log(obj);

相关问题