javascript - 使用javascript将复杂数组转换为简单数组

标签 javascript arrays object reduce

我有像这样的复杂 json:

const lstCountry = {
   "cols": ["id", "countryName", "area"],
   "data": [
       ["1", "Russia", "17098242"],
       ["2", "Canada", "9970610"],
       ["3", "China", "9640821"],
       ["4", "United States", "9629091"],
       ["5", "Brazil", "8514877"],
       ["6", "Australia", "7741220"],
       ["7", "India", "3287263"],
       ["8", "Argentina", "2780400"],
       ["9", "Kazakhstan", "2724900"],
       ["10", "Sudan", "2505813"]
    ]
};

现在我想转换为简单数组作为输出,如下所示:

const countryList = [
    { "id": "1", "countryName": "Russia", "area": "17098242" },
    { "id": "2", "countryName": "Canada", "area": "9970610" },
    { "id": "3", "countryName": "China", "area": "9640821" },
    { "id": "4", "countryName": "United States", "area": "9629091" },
    { "id": "5", "countryName": "Brazil", "area": "8514877" },
    { "id": "6", "countryName": "Australia", "area": "7741220" },
    { "id": "7", "countryName": "India", "area": "3287263" },
    { "id": "8", "countryName": "Argentina", "area": "2780400" },
    { "id": "9", "countryName": "Kazakhstan", "area": "2724900" },
    { "id": "10", "countryName": "Sudan", "area": "2505813" },
];

我已经在下面尝试过,但使用索引作为键获得了输出,那么我如何使用 cols 数组作为键 和另一个 data 数组作为值来转换该键 并使用这些键和值组合生成我自己的数组。

或者有没有简单的方法来归档这个,比如使用map、reduce?

已经尝试过这个:

let mainData = [];
for (let i = 1; i < Object.keys(data).length; i++) {
    const eleData = data[Object.keys(data)[i]];
    for (let j = 0; j < eleData.length; j++) {
        const element = Object.assign({}, eleData[j]);
        mainData.push(element);
    };            
};
console.log('mainData:', mainData)

尝试的函数输出:

const mainData = [
    { "0": "1", "1": "Russia", "2": "17098242" },
    { "0": "2", "1": "Canada", "2": "9970610" },
    { "0": "3", "1": "China", "2": "9640821" },
    { "0": "4", "1": "United States", "2": "9629091" },
    { "0": "5", "1": "Brazil", "2": "8514877" },
    { "0": "6", "1": "Australia", "2": "7741220" },
    { "0": "7", "1": "India", "2": "3287263" },
    { "0": "8", "1": "Argentina", "2": "2780400" },
    { "0": "9", "1": "Kazakhstan", "2": "2724900" },
    { "0": "10", "1": "Sudan", "2": "2505813" },
];

最佳答案

您可以简单地map每个对象并使用reduce创建与每列相关的每个对象:

const lstCountry = {
   "cols": ["id", "countryName", "area"],
   "data": [
       ["1", "Russia", "17098242"],
       ["2", "Canada", "9970610"],
       ["3", "China", "9640821"],
       ["4", "United States", "9629091"],
       ["5", "Brazil", "8514877"],
       ["6", "Australia", "7741220"],
       ["7", "India", "3287263"],
       ["8", "Argentina", "2780400"],
       ["9", "Kazakhstan", "2724900"],
       ["10", "Sudan", "2505813"]
    ]
};

const { cols, data } = lstCountry

console.log(data.map(arr => arr.reduce((a, e, i) => (a[cols[i]] = e, a), {})))

编辑:作为函数:

const fn = (cols, data) => data.map(arr => arr.reduce((a, e, i) => (a[cols[i]] = e, a), {}))

console.log(fn(['test'], [[1],[2],[3],[4]]))
console.log(fn(['test', 'true'], [[1,1],[2,1],[3,1],[4,1]]))

该解决方案是最注重性能的,因为根据此 JSPerf 只有两个循环,而不是三个。 :

JSPerf

关于javascript - 使用javascript将复杂数组转换为简单数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57490037/

相关文章:

javascript - JavaScript 中的对象覆盖键值对

javascript - 在 react 路由器中的路由之间设置动画/转换的正确方法是什么

javascript - EmberJS : Unit test class-based helpers

javascript - 如何在 Angular Controller 中使用按钮 id?

python - Objective-C 中常用的数组选项

java - 从 Java 对象类到 C++

java - java中对象的层次结构的序列化

javascript - 在不重新加载页面的情况下加载 div 中的内容

c++ - 在析构函数中多次删除

javascript - 递归数组修改