javascript - 在从现有阵列中创建新阵列时需要帮助
问题描述
我有一个这样的数组:
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 是一个数组,我如何避免创建空白对象,不知道发生这种情况的实际原因是什么。请在此处找到结果附件 输入图像描述
解决方案
如果prop 是数组,则可以使用嵌套flatMap()
和嵌套。获得一维数组后用于插入属性。map()
val
map()
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)
推荐阅读
- javascript - 在谷歌表格的单元格中输入内容后,立即锁定整个单独的行以供其他共享用户进行编辑
- amazon-web-services - 如何集成 API Gateway 调用带参数的 Lambda 函数?
- php - 在 phpunit 测试用例下运行后出现错误
- ios - 构建失败并出现错误:未定义符号:___darwin_check_fd_set_overflow
- flutter - 颤动:导航到主页显示错误
- objective-c - 获取窗口恢复边界
- python - 如何将 1 个数字放入 pastebin,打印出来并等待 1 秒,然后再放入第二个数字
- javascript - Object.assign() 修改其参数?
- xml - 使用 xslt 将平面 xml 转换为分层 xml
- mysql - 将 ASP.NET 样板应用程序部署到 Azure 时出现 SQLException