javascript - 按数组属性的长度对 JavaScript 对象进行排序
问题描述
我有一个这样的对象:
var list = {
"you": [100,200,300],
"me": [75,4,5,6,8,9],
"foo": [116,345,1,23,56,78],
"bar": [15,34]
};
有没有办法sort
通过数组属性的长度来处理这个对象?
预期输出:
var res = [[116,345,1,23,56,78],[75,4,5,6,8,9],[100,200,300],[15,34]]
我尝试使用 lodash 的sortby
功能。
var data = {
"abc": ["20288", "d8f0", "4a5d", "1a8a0"],
"kkl": ["bnb", "lll", "zxc"],
"F17": ["ee547", "42e9"],
"cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
}
var res = _.sortBy(data, function(val) {
return parseInt(val.length);
});
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
解决方案
如果要将输出作为排序数组值的数组:
使用解构赋值
length
通过调用从结果数组中获取属性Object.values
,然后按降序对其进行排序。
const data = {
"abc": ["20288", "d8f0", "4a5d", "1a8a0"],
"kkl": ["bnb", "lll", "zxc"],
"F17": ["ee547", "42e9"],
"cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
};
const res = Object.values(data).sort(({length:a}, {length:b}) => b - a);
console.log(res);
如果您想通过根据数组值的长度重新排列键来对对象本身进行排序。
有没有办法按数组属性的长度对这个对象进行排序?
如果要根据
length
数组值重新排列原始对象属性,那么我们首先需要按键排序,然后使用键的排序顺序创建一个新 对象Array.reduce
。
const data = {
"abc": ["20288", "d8f0", "4a5d", "1a8a0"],
"kkl": ["bnb", "lll", "zxc"],
"F17": ["ee547", "42e9"],
"cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
};
//sorting in descending order
const obj = Object.keys(data)
.sort((a, b) => data[b].length - data[a].length )
.reduce((acc, ele) => { acc[ele] = data[ele]; return acc; }, {});
console.log(obj);