作为响应,我得到了一个包含存款的数组,我需要获取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'
}
]
答案 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。
答案 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”,则此方法将无效。如果是这种情况,请在下面进行注释,然后我将重写答案以解决该问题。