将对象数组转换为已排序的数组数组
Posted
技术标签:
【中文标题】将对象数组转换为已排序的数组数组【英文标题】:Convert an array of objects to sorted array of arrays 【发布时间】:2017-09-13 08:33:24 【问题描述】:我有一个对象数组,比如说
[a:'one',aa:'eleven',a:'two',aa:'twelve',a:'three',aa:'thirteen']
我想把对象转换成数组,像这样
[['one','eleven'], ['two','twelve'],['three','thirteen']]
因为属性名称应该映射到数组中给定的正确索引
这可以使用 Lodash 或 javascript 吗?
【问题讨论】:
顺序重要吗? 看起来顺序很重要,所以您需要某种映射(属性“a”进入数组槽 1,属性“aa”进入数组槽 2,依此类推) 我就是这么想的。一个简单的sort
可能不正确:)
【参考方案1】:
这是一种使用 lodash#map 和 lodash#unary 包装的 lodash#map
iteratee 的方法。
var result = _.map(data, _.unary(_.map));
var data = [a:'one',aa:'eleven',a:'two',aa:'twelve',a:'three',aa:'thirteen'];
var result = _.map(data, _.unary(_.map));
console.log(result);
body > div min-height: 100%; top: 0;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
更新
要保留键顺序,您可以将 lodash#map
iteratee 替换为 lodash#at,即 partially 与定义值顺序的 keys
一起应用。
var keys = ['aa', 'a'];
var result = _.map(data, _.unary(_.partialRight(_.at, keys)));
var data = [a:'one',aa:'eleven',a:'two',aa:'twelve',a:'three',aa:'thirteen'];
var keys = ['aa', 'a'];
var result = _.map(data, _.unary(_.partialRight(_.at, keys)));
console.log(result);
body > div min-height: 100%; top: 0;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
上述解决方案的 es6 替代方案是:
var keys = ['aa', 'a'];
var result = _.map(data, v => _.at(v, keys));
var data = [a:'one',aa:'eleven',a:'two',aa:'twelve',a:'three',aa:'thirteen'];
var keys = ['aa', 'a'];
var result = _.map(data, v => _.at(v, keys));
console.log(result);
body > div min-height: 100%; top: 0;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
【讨论】:
我们如何确保将某个键放置在特定索引处【参考方案2】:如果原始对象中的某些键必须转到数组中的特定槽,那么您可以创建一个键到槽号的映射。
var data = [
a: 'one',
aa: 'eleven'
,
a: 'two',
aa: 'twelve'
,
a: 'three',
aa: 'thirteen'
];
var keyToSlot =
a: 0,
aa: 1
;
var result = data.map(function(entry)
var keys = Object.keys(entry);
return keys.reduce(function(acc, key)
var slot = keyToSlot[key];
acc[slot] = entry[key];
return acc;
, []);
);
console.log(result);
【讨论】:
【参考方案3】:您可以通过抓取每个对象的键,对其进行排序,然后将它们映射到一个数组来做到这一点。
const arr = [a:'one',aa:'eleven',a:'two',aa:'twelve',a:'three',aa:'thirteen']
const res = arr.map(x => Object.keys(x).sort().map(y => x[y]));
console.log(res)
一步一步:
arr.map
遍历每个对象
Object.keys(x).sort()
获取对象的键并按字母顺序排序。
上述结果中的.map(y => x[y])
将对象的键转换为各自的值。
【讨论】:
但我还需要键位于数组中的特定索引处,键不会以相同的顺序得到保证 @ua_boazsort()
调用密钥保证订单不是吗?您需要指定某种方式对键进行排序,在这种情况下我选择了字母顺序。
@ua_boaz 如果您想要的话,不可能按照您在代码中编写键的顺序对对象进行排序。以上是关于将对象数组转换为已排序的数组数组的主要内容,如果未能解决你的问题,请参考以下文章