将对象数组转换为已排序的数组数组

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_boaz sort() 调用密钥保证订单不是吗?您需要指定某种方式对键进行排序,在这种情况下我选择了字母顺序。 @ua_boaz 如果您想要的话,不可能按照您在代码中编写键的顺序对对象进行排序。

以上是关于将对象数组转换为已排序的数组数组的主要内容,如果未能解决你的问题,请参考以下文章

将对象转换为数组

基于数组排序对象以生成排序数组

如何对 Javascript 对象进行排序,或将其转换为数组?

转换对象数组以在javascript中进行排序?

js数组对象常用的方法

iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。