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

时间:2019-10-07 12:33:58

标签: javascript angular

作为响应,我得到了一个包含存款的数组,我需要获取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'
}
]

6 个答案:

答案 0 :(得分:4)

您可以仅检查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);

答案 1 :(得分:1)

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

// 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()

请注意,此功能是ES2019生态系统的一部分,可能并非对所有用户都可用。参见browsers compatibility

enter image description here

答案 2 :(得分:1)

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

首先减少阵列,然后删除仍包含内部沉积物的沉积物。这样就可以得到预期的结果。

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);

(尽管代码被最小化了。)

答案 3 :(得分:0)

您可以使用 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)

答案 4 :(得分:-1)

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})
   }
  }
}
}

答案 5 :(得分:-1)

如果所有存款具有array.forEach()数组,请使用linkedDeposites遍历所有存款-将其连接到结果数组。否则,将单个存款者推入结果数组。

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

注意:如果“ linkedDeposites”内的任何存款人都有自己的“ linkedDeposites”,则此方法将无效。如果是这种情况,请在下面进行注释,然后我将重写答案以解决该问题。