[英]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.