首页 > 解决方案 > 在从现有阵列中创建新阵列时需要帮助

问题描述

我有一个这样的数组:

const foo = [{
        cur: "GBT",
        val: [800, 450]
    },
    {
        cur: "USD",
        val: 100
    },
    {
        cur: "EUR",
        val: 200
    },
    {
        cur: "GBT",
        val: [100, 250]
    }]

我想从上面的数组中实现下面的结构:

   [{
        id: 0,
        cur: "GBT",
        val: 800
    },

    {
        id: 1,
        cur: "GBT",
        val: 450
    },
    {
        id: 2,
        cur: "USD",
        val: 100
    },

    {
        id: 3,
        cur: "EUR",
        val: 200
    },

    {
        id: 4,
        cur: "GBT",
        val: 100
    },

    {
        id: 5,
        cur: "GBT",
        val: 250
    }]

这是我尝试过的:

foo.reduce((x, y, i, a) => {
    let resObj = {};
    if (Array.isArray(y.val)) {
        let cnt = 0;
        (a.indexOf(y) === 0 ? cnt : cnt += i)
        for (let j = 0; j < y.val.length; j++) {
            const obj = {};
            obj["id"] = cnt;
            obj["value"] = y.val[j]
            obj["currency"] = y.cur;
            x.push(obj);
            cnt++;
        }
    } else {
        let cnt = 1
        resObj["id"] = i + cnt;
        resObj["value"] = y.val;
        resObj["currency"] = y.cur;
    }
    return x.concat(resObj)
}, [])

观察到的错误 1. 当reduce函数找到数组类型对象的下一个val时,它并没有增加计数器,所以id等于前一个计数器。2.我还想知道如果对象具有 val 是一个数组,我如何避免创建空白对象,不知道发生这种情况的实际原因是什么。请在此处找到结果附件 输入图像描述

标签: javascript

解决方案


如果prop 是数组,则可以使用嵌套flatMap()和嵌套。获得一维数组后用于插入属性。map()valmap()id

const foo = [{
        cur: "GBT",
        val: [800, 450]
    },
    {
        cur: "USD",
        val: 100
    },
    {
        cur: "EUR",
        val: 200
    },
    {
        cur: "GBT",
        val: [100, 250]
    }]
const res = foo.flatMap(x => Array.isArray(x.val) ? 
                           x.val.map(val => ({cur: x.cur, val})) :
                           {...x}
                   ).map((x,id) => ({...x, id}))
console.log(res)
                   
                
                          


推荐阅读