Valitskiy Dmitriy
Valitskiy Dmitriy

Reputation: 160

How to push objects from array in object to another array?

I get in response an array with deposits, and I need to get depositId, but multicurrency deposits have an array of several deposits. (First array) As a result, I need to have an array with deposits, without linkedDeposits. (On the example of the second array) I just can’t figure out how to do this

[ {
    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'
}
]

Upvotes: 1

Views: 103

Answers (6)

user4676340
user4676340

Reputation:

here is my take on your issue.

Start by reducnig your array, then remove the deposits that still contains inner deposits. That leaves you with the expected result.

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

(The code is minified to its maximum though.)

Upvotes: 1

Gibor
Gibor

Reputation: 1721

Use the array.forEach() to loop on all deposites, if they have linkedDeposites array - concat it to result array. else- push the single deposite to result array.

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

NOTE: this will not work if any deposite inside "linkedDeposites" has its own "linkedDeposites". if that is the case comment down below and I'll rewrite my answer to take care of that as well.

Upvotes: -1

Ulysse BN
Ulysse BN

Reputation: 11376

One more solution that I find elegant since it doesn't mutate original array, nor any array:

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

See array.flatMap() for more details about this method.

Beware, this function is part of ES2019 ecosystem and might not be available for all users. See browsers compatibility.

enter image description here

Upvotes: 1

RamAnji
RamAnji

Reputation: 470

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

Upvotes: -1

Bilal Siddiqui
Bilal Siddiqui

Reputation: 3629

You could just check if depositId exists then add item else add linkDeposits array into final array:

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

Upvotes: 4

cccn
cccn

Reputation: 949

You can use reduce method, like this:

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)

Upvotes: 0

Related Questions