【问题标题】:Transform a javascript array of object to an array of array将 javascript 对象数组转换为数组数组
【发布时间】:2018-04-09 12:23:07
【问题描述】:

我正在寻找一种在 ES6 中转换这个数组的优雅方式:

var src = [{x:1,y:'a'},{x:2,y:'b'}];

到这个数组:

var desc = [[1,2],["a","b"]];

其中包含一个包含所有属性的数组和一个包含所有值的数组。

为此,我编写了以下代码:

var src = [{x:1,y:'a'},{x:2,y:'b'}];

var prop1 = [];
var prop2 = [];

src.forEach(item => {
    prop1.push(item.x)
    prop2.push(item.y);
});

var desc = [prop1, prop2];

它工作正常,但它很长,所以我正在寻找最终的改进和简短的代码。

【问题讨论】:

标签: javascript arrays ecmascript-6


【解决方案1】:

您命名 props 顺序(因为无法保证 object 中键的顺序),然​​后通过提取对应的 prop 值映射到 src 数组。

var src = [{x:1,y:'a'},{x:2,y:'b'}]

var props = ['x', 'y'];

var result = props.map(prop => src.map(x => x[prop]))

console.log(result)

【讨论】:

  • 不错的一个。但是,如果 props = Object.keys(src[0]) 而不是硬编码值可能会更酷。
  • @MohammadUsman 不是。不保证键的顺序。
  • 是的,你是对的。在这种情况下,我忘记了订单。
【解决方案2】:

你可以使用.reduce():

let src = [{x: 1, y: 'a'}, {x:2, y: 'b'}];

let result = src.reduce((a, c) => (a[0].push(c.x), a[1].push(c.y), a), [[], []]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

文档:

【讨论】:

    【解决方案3】:

    您可以迭代数组,然后通过对象的键并切换目标元素的外部和内部索引。

    var src = [{ x: 1, y: 'a' }, { x: 2, y: 'b' }],
        desc = [];
    
    src.forEach(o => Object.keys(o).forEach((k, i) => (desc[i] = desc[i] || []).push(o[k])));
    
    console.log(desc);

    【讨论】:

    • 唯一可能的问题是对象中的属性顺序无法保证
    • 对,我假设键的顺序与给定代码中的顺序相同。
    猜你喜欢
    • 2019-10-22
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多