[英]How to change values in nested object to concat with array, and matching with id with javascript
我有這個 object:
const obj = {
children: [
{
value: "1",
label: "Organization",
Estatus: "1",
IdTipo: "1",
children: [
{
value: "68",
label: "REGION 1",
IdTipo: "3",
Estatus: "1",
children: [
{
value: "13",
label: "Store 1",
IdTipo: "3",
Estatus: "1",
},
{
value: "15",
label: "Store 2",
IdTipo: "3",
Estatus: "1",
},
{
value: "24",
label: "Store 3",
IdTipo: "3",
Estatus: "1",
},
],
},
{
value: "69",
label: "REGION 2",
IdTipo: "3",
Estatus: "1",
children: [
{
value: "3",
label: "Store 4",
IdTipo: "3",
Estatus: "1",
},
{
value: "11",
label: "Store 5",
IdTipo: "3",
Estatus: "1",
},
],
},
],
},],};
我有這個數組
const arr = [
{
"id": 13,
"balance": 44958.89
},
{
"id": 15,
"balance": 55687.89
},
{
"id": 24,
"balance": 16768.89
},
]
我需要將 obj 值和 arr id 匹配到 concat label 並在 object 中進行平衡。我期望這樣:
{
children: [
{
value: "1",
label: "Organization",
Estatus: "1",
IdTipo: "1",
children: [
{
value: "68",
label: "REGION 1",
IdTipo: "3",
Estatus: "1",
children: [
{
value: "13",
label: "Store 1 44958.89",
IdTipo: "3",
Estatus: "1",
},
{
value: "15",
label: "Store 2 55687.89",
IdTipo: "3",
Estatus: "1",
},
{
value: "24",
label: "Store 3 16768.89",
IdTipo: "3",
Estatus: "1",
},
],
},
如您所見,在我的 object 中,標簽現在有名稱和余額。 我不知道它是否很容易解決,但我很困惑,我不知道如何解決它。 謝謝!!
這是一個具有不可變遞歸 function 的解決方案:
/**
* @typedef {object} OrgElement
* @property {string} value
* @property {string} label
* @property {string} IdTipo
* @property {string} Estatus
* @property {string} [children]
*/
/**
*
* @param {OrgElement[]} orgElements
* @param {{id: number, balance: number}[]} balanceData
* @returns {OrgElement[]}
*/
function updateOrgs(orgElements, balanceData) {
const data = [...balanceData];
return orgElements.map((orgElement) => {
const updatedOrgElement = { ...orgElement };
if (updatedOrgElement.children && data.length > 0) {
updatedOrgElement.children = updateOrgs(updatedOrgElement.children, data);
}
if (updatedOrgElement.value && data.length > 0) {
const foundItemIndex = data.findIndex(
(item) => item.id.toString() === updatedOrgElement.value
);
if (foundItemIndex > -1) {
const value = data.splice(foundItemIndex, 1)[0];
updatedOrgElement.label = `${updatedOrgElement.label} ${value.balance}`;
}
}
return updatedOrgElement;
});
}
const result = { children: updateOrgs(obj.children, arr) };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.