【问题标题】: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 可能不正确:)

标签: javascript arrays typescript lodash


【解决方案1】:

这是一种使用 lodash#maplodash#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 如果您想要的话,不可能按照您在代码中编写键的顺序对对象进行排序。
    猜你喜欢
    • 2021-10-02
    • 2018-10-13
    • 2019-04-13
    • 2018-11-08
    • 2021-05-03
    • 2018-12-04
    相关资源
    最近更新 更多