programmer
programmer

Reputation: 770

Finding element by id in array from other array

I've 2 arrays:

address - array of object with id

pickup - array of object with id

And I need connect these arrays into 1 by id.

example:

address = [
  {id: "123", name: "any city street"},
  {id: "124", name: "any city street"},
  {id: "125", name: "any city street"},
  {id: "126", name: "any city street"}
];

pickups = [
  {id: "123", time: "10:20"},
  {id: "124", time: "11:30"},
  {id: "125", time: "12:00"},
  {id: "126", time: "12:20"}
];

And I need connect it by id with result like:

{id: "124", name: "name smth", time: "11:30"}

I mean about map this 2 arrays into one

Upvotes: 3

Views: 2215

Answers (7)

Alberto
Alberto

Reputation: 12929

address = [
  {id: "123", name: "any city street"},
  {id: "124", name: "any city street"},
  {id: "125", name: "any city street"},
  {id: "126", name: "any city street"}
];

pickups = [
  {id: "123", time: "10:20"},
  {id: "124", time: "11:30"},
  {id: "125", time: "12:00"},
  {id: "126", time: "12:20"}
];

const result = pickups.map(pickup => {
    let match = address.find(addr => addr.id == pickup.id);
    return {
         id : pickup.id, 
         time: pickup.time,
         name : match.name,
    }
})
console.log(result);

Or if you really really like short code:

pickups.map(el => ({ ...el, ...address.find(addr => addr.id == el.id)}))

Be aware that this works fine only if there is always a match between pickups and address

Upvotes: 5

Rilla
Rilla

Reputation: 534

Using Reduce:

const address = [
  {id: "123", name: "any city street"},
  {id: "124", name: "any city street"},
  {id: "125", name: "any city street"},
  {id: "126", name: "any city street"}
];

const pickups = [
  {id: "123", time: "10:20"},
  {id: "124", time: "11:30"},
  {id: "125", time: "12:00"},
  {id: "126", time: "12:20"}
];

const resultArray = [];

address.reduce((resultArr, currentAddress) => {
  let currentAddressPickup = pickups.find(pickup => pickup.id == currentAddress.id);
  let mergedCurrectAddressAndPickup = {
    ...currentAddress,
    ...currentAddressPickup
  }
  
  resultArr.push(mergedCurrectAddressAndPickup)
  return resultArr;
}, resultArray)

console.log(resultArray)

Upvotes: 0

Sven.hig
Sven.hig

Reputation: 4519

Using Map

address = [ {id: "123", name: "any city street"}, {id: "124", name: "any city street"}, {id: "125", name: "any city street"}, {id: "126", name: "any city street"} ];
pickups = [ {id: "123", time: "10:20"}, {id: "124", time: "11:30"}, {id: "125", time: "12:00"}, {id: "126", time: "12:20"} ];
 map= new Map()
 address.map(o=>map.set(o.id,o))
 var res= pickups.map(o=>{
 var v=map.get(o.id); 
 if(v) v.time=o.time
  return v})
console.log(res)

Upvotes: 0

Shahnawaz Hossan
Shahnawaz Hossan

Reputation: 2720

address = [
    { id: "123", name: "any city street" },
    { id: "124", name: "any city street" },
    { id: "125", name: "any city street" },
    { id: "126", name: "any city street" }
];

pickups = [
    { id: "123", time: "10:20" },
    { id: "124", time: "11:30" },
    { id: "125", time: "12:00" },
    { id: "126", time: "12:20" }
];

const mergedArr = address.map((item, i) => {
    if (item.id === pickups[i].id) {
        return Object.assign({}, item, pickups[i]);
    }
});

console.log(mergedArr);

Upvotes: 0

hgb123
hgb123

Reputation: 14891

Below snippet could help you

const addresses = [
  { id: '123', name: 'any city street' },
  { id: '126', name: 'any city street' },
  { id: '124', name: 'any city street' },
  { id: '125', name: 'any city street' },
  { id: '127', name: 'any city street' }
]

const pickups = [
  { id: '126', time: '12:20' },
  { id: '123', time: '10:20' },
  { id: '125', time: '12:00' },
  { id: '124', time: '11:30' }
]

const notUndefined = element => !!element

const res = addresses
  .map(address => {
    const pickup = pickups.find(pickup => pickup.id === address.id)
    if (pickup) {
      return { ...address, ...pickup }
    }
  })
  .filter(notUndefined)

console.log(res)

Upvotes: 0

Rahul Bhobe
Rahul Bhobe

Reputation: 4451

You could do:

let address = [
  {id: "123", name: "any city street"},
  {id: "124", name: "any city street"},
  {id: "125", name: "any city street"},
  {id: "126", name: "any city street"}
];

let pickups = [
  {id: "123", time: "10:20"},
  {id: "124", time: "11:30"},
  {id: "125", time: "12:00"},
  {id: "126", time: "12:20"}
];

let obj = {};

for (let i=0; i<address.length; i++) {
  obj[address[i].id] = obj[address[i].id] || {id: address[i].id};
  obj[address[i].id].name = address[i].name;
}

for (let i=0; i<pickups.length; i++) {
  obj[pickups[i].id] = obj[pickups[i].id] || {id: pickups[i].id};
  obj[pickups[i].id].time = pickups[i].time;
}

let result = Object.keys(obj).map(id => obj[id]);
console.log(result);

Upvotes: 1

AlexAV-dev
AlexAV-dev

Reputation: 1175

const address = [
  {id: "123", name: "any city street"},
  {id: "124", name: "any city street"},
  {id: "125", name: "any city street"},
  {id: "126", name: "any city street"}
];

const pickups = [
  {id: "123", time: "10:20"},
  {id: "124", time: "11:30"},
  {id: "125", time: "12:00"},
  {id: "126", time: "12:20"}
];

const result = address.map((rec, index) => {
  return { ...rec, ...pickups[index]}
})

console.log(result)

Upvotes: 0

Related Questions