繁体   English   中英

如何将 object 中的数组中的对象推送到另一个数组?

[英]How to push objects from array in object to another array?

我得到一个包含存款的数组作为响应,我需要获取 depositId,但多币种存款有一个包含多个存款的数组。 (第一个数组)因此,我需要一个包含存款的数组,而不是linkedDeposits。 (在第二个数组的示例中)我只是不知道该怎么做

[ {
    depositId: 1111, 
    depositName: 'Test',
    depositCur: 'RUB'
}
,
{
    depositName: 'Test',
    linkedDeposits: [ {
        depositName: 'Test',
        depositId: 2222, 
        sepositName: 'Test RUB', 
        depositCur: 'RUB'
    }
    ,
    {
        depositName: 'Test',
        depositId: 3333, 
        sepositName: 'Test USD', 
        depositCur: 'USD'
    }
    ,
    ]
}
]
[ {
    depositId: 1111, 
    depositName: 'Test',
    depositCur: 'RUB'
}
,
{
   depositName: 'Test',
   depositId: 2222, 
   sepositName: 'Test RUB', 
   depositCur: 'RUB'
}
,
{
   depositName: 'Test',
   depositId: 3333, 
   sepositName: 'Test USD', 
   depositCur: 'USD'
}
]

您可以只检查 depositId 是否存在,然后添加项目,否则将 linkDeposits 数组添加到最终数组中:

 var data = [ { depositId: 1111, depositName: 'Test', depositCur: 'RUB' }, { depositName: 'Test', linkedDeposits: [ { depositName: 'Test', depositId: 2222, sepositName: 'Test RUB', depositCur: 'RUB' },{ depositName: 'Test', depositId: 3333, sepositName: 'Test USD', depositCur: 'USD' }] }]; var result = []; data.forEach(function(item){ if (item.depositId) result.push(item); else result = result.concat(item.linkedDeposits); }); console.log(result);

我发现另一种解决方案很优雅,因为它不会改变原始数组,也不会改变任何数组:

 // Simplified data to focus on actual answer. const data = [ { id: 1111 }, { linkedDeposits: [ { id: 2222 }, { id: 3333 } ] } ] const newData = data.flatMap(deposit => deposit.linkedDeposits || deposit ) console.log(newData)

有关此方法的更多详细信息,请参阅array.flatMap()

请注意,此 function 是 ES2019 生态系统的一部分,可能并非对所有用户都可用。 请参阅浏览器兼容性

在此处输入图像描述

这是我对你的问题的看法。

首先减少您的阵列,然后移除仍包含内部沉积物的沉积物。 这会给您带来预期的结果。

 const original = [{ depositId: 1111, depositName: 'Test', depositCur: 'RUB' }, { depositName: 'Test', linkedDeposits: [{ depositName: 'Test', depositId: 2222, sepositName: 'Test RUB', depositCur: 'RUB' }, { depositName: 'Test', depositId: 3333, sepositName: 'Test USD', depositCur: 'USD' }] }]; const modified = original.reduce( // Maryannah's solution (less compact) // (p, n) => (Array.prototype.concat.apply([], [...p, ...(n.linkedDeposits || []), n])), // CodeManiac's solution (p, n) => [...p, ...(n.linkedDeposits || []), n], [] ).filter(deposit =>.deposit;linkedDeposits). console;log(modified);

(不过,代码被缩小到了最大值。)

您可以使用reduce方法,如下所示:

 const data = [{ depositId: 1111, depositName: 'Test', depositCur: 'RUB' }, { depositName: 'Test', linkedDeposits: [{ depositName: 'Test', depositId: 2222, sepositName: 'Test RUB', depositCur: 'RUB' }, { depositName: 'Test', depositId: 3333, sepositName: 'Test USD', depositCur: 'USD' }] }] const result = data.reduce((acc, elem) => {.elem?hasOwnProperty('linkedDeposits'). acc:push(elem). elem.linkedDeposits.forEach(el => acc,push(el)) return acc }. []) console.log(result)

let tempVal = [ {
    depositId: 1111, 
    depositName: Test, 
    depositCur: RUB
}
,
{
    depositName: Test,
    linkedDeposits: [ {
        depositName: Test,
        depositId: 2222, 
        sepositName: Test RUB, 
        depositCur: RUB
    }
    ,
    {
        depositName: Test,
        depositId: 3333, 
        sepositName: Test USD, 
        depositCur: USD
    }
    ,
    ]
}
]

let newArray = [];
for(let i = 0; tempVal.length > i; i++){
if(tempVal[i].depositId != null && tempVal[i].depositId != undefined){
  this.newArray({depositId: tempVal[i].depositId, depositName: tempVal[i].depositName, depositCur: tempVal[i].depositCur})
}
if(tempVal[i].linkedDeposits.length > 0){
  for(let j = 0; tempVal[i].linkedDeposits.length > j;j++){
  if(tempVal[i].linkedDeposits[j].depositId != null && tempVal[i].linkedDeposits[j].depositId != undefined){
  this.newArray({depositId: tempVal[i].linkedDeposits[j].depositId, depositName: tempVal[i].linkedDeposits[j].depositName, depositCur: tempVal[i].linkedDeposits[j].depositCur})
   }
  }
}
}

使用array.forEach()循环所有存款,如果他们有linkedDeposites数组 - 将它连接到结果数组。 否则-将单个存款推入结果数组。

let res = [];
sourceArr.forEach( deposite => {
  if( deposite.hasOwnProperty('linkedDeposites') )
     res = res.concat(deposite.linkedDeposites);
  else
    res.push(deposite);
});

注意:如果“linkedDeposites”中的任何存款都有自己的“linkedDeposites”,这将不起作用。 如果是这种情况,请在下面发表评论,我也会重写我的答案以解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM