[英]how to convert an Array nested object into an Array object?
我有一個數組:
let testData = [
{
MC: "11233",
jobid: 113331,
list: [
{ Q1: 1113, Q2: 333, code: "thisis1" },
{ Q1: 333, Q2: 111, code: "thisis2" },
{ Q1: 333, code: "thisis3" },
],
},
{
MC: "332211",
jobid: 3333,
list: [
{ Q1: 444, Q2: 555, code: "thisis4" },
],
},
];
我想把它轉換成:
[
{ MC: "11233", jobid: 113331, Q1: 1113, Q2: 333, code: "thisis1" },
{ MC: "11233", jobid: 113331, Q1: 333, Q2: 111, code: "thisis2" },
{ MC: "11233", jobid: 113331, Q1: 333, code: "thisis3" },
{ MC: "332211", jobid: 3333, Q1: 444, Q2: 555, code: "thisis4" },
]
我試圖寫一個這樣的遞歸函數
let newData = [];
testData.forEach((element, index) => {
let flattedObj = {};
deconstructeArrayObject(flattedObj, element);
});
和
const deconstructeArrayObject = (flattedObj, targetObj) => {
let tempArr = [];
for (let key in targetObj) {
if (Array.isArray(targetObj[key])) {
targetObj[key].forEach((element) => {
tempArr.push(
...JSON.parse(
JSON.stringify(
deconstructeArrayObject(flattedObj, element, outputArray)
)
)
);
});
} else {
flattedObj[key] = targetObj[key];
}
}
return flattedObj; // actually I want this function to return an array
};
我不知道我應該如何達到我的目標。 有什么提示或建議嗎?
迭代外部數組, 解構其屬性,然后對每個內部數組執行相同的操作,將所需的數據推送到結果中:
const input = [ { MC: "11233", jobid: 113331, list: [ { Q1: 1113, Q2: 333, code: "thisis1" }, { Q1: 333, Q2: 111, code: "thisis2" }, { Q1: 333, code: "thisis3" }, ], }, { MC: "332211", jobid: 3333, list: [ { Q1: 444, Q2: 555, code: "thisis4" }, ], }, ]; const result = []; for (const {MC, jobid, list} of input) { for (const {Q1, Q2, code} of list) { result.push(({MC, jobid, Q1, Q2, code})); } } console.log(result);
這個怎么樣:
let testData = [{"MC":"11233","jobid":113331,"list":[{"Q1":1113, "test": [{ 'a' : 1}, { 'a' : 2}],"Q2":333,"code":"thisis1"},{"Q1":333,"Q2":111,"code":"thisis2"}, {"Q1":333,"code":"thisis3"}]} ,{"MC":"332211","jobid":3333,"list":[{"Q1":444,"Q2":555,"code":"thisis4"}]}] const deconstructeArrayObject = (targetObj) => { let flattedObj = {}; let tempArr = []; let arrayKeys = []; for (let key in targetObj) { // Save array keys if (Array.isArray(targetObj[key])) { arrayKeys.push(key); } else { flattedObj[key] = targetObj[key]; } } // flatten array elements arrayKeys.forEach(key => { targetObj[key].forEach((element) => { const newEl = { ...flattedObj, ...element }; // Recursion const arr = deconstructeArrayObject(newEl); tempArr.push(...arr); }); }); if(tempArr.length === 0) { return [flattedObj]; } return tempArr; } let newData = []; testData.forEach((element, index) => { const result = deconstructeArrayObject(element); newData.push(...result) }); console.log(newData)
結果將是:
[
{
"MC": "11233",
"jobid": 113331,
"Q1": 1113,
"Q2": 333,
"code": "thisis1",
"a": 1
},
{
"MC": "11233",
"jobid": 113331,
"Q1": 1113,
"Q2": 333,
"code": "thisis1",
"a": 2
},
{
"MC": "11233",
"jobid": 113331,
"Q1": 333,
"Q2": 111,
"code": "thisis2"
},
{
"MC": "11233",
"jobid": 113331,
"Q1": 333,
"code": "thisis3"
},
{
"MC": "332211",
"jobid": 3333,
"Q1": 444,
"Q2": 555,
"code": "thisis4"
}
]
這是一個更通用的解決方案,它不依賴於特定的鍵名等。
您缺少的是子問題的答案: how do I merge multiple "deconstructed" objects in an array into my "flattedObj"?
這是通過在下面的函數中調用Object.assign
來完成的。
function deconstructeArrayObject(obj) {
const deconstructedObj = {};
for (const key in obj) {
if (Array.isArray(obj[key])) {
Object.assign(
deconstructedObj,
...obj[key].map(deconstructeArrayObject)
);
} else {
deconstructedObj[key] = obj[key];
}
}
return deconstructedObj;
}
// use like this
let newData = testData.map(deconstructeArrayObject);
你試試這個代碼:
let result = testData.flatMap(data => data.list.map(el => {
let { list, ...rest } = data;
return { ...rest, ...el };
}));
您可以使用 Object.assing 並創建扁平化的新對象數組:
let testData = [ { "MC":"11233", "jobid":113331, "list":[ {"Q1":1113,"Q2":333,"code":"thisis1"}, {"Q1":333,"Q2":111,"code":"thisis2"}, {"Q1":333,"code":"thisis3"} ]}, { "MC":"332211", "jobid":3333, "list":[ {"Q1":444,"Q2":555,"code":"thisis4"} ]} ]; let result = testData.map(d1 => { return d1.list.map(d2 => { return Object.assign({ MC: d1.MC, jobid: d1.jobid }, d2) }); }).flat(); console.log(result);
這是一種使用 flatMap 的方法,它應該返回您需要的內容。
testData.flatMap(job => job.list.map(item => {
item.MC = job.MC;
item.jobid = job.jobid;
return item;
}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.