JavaScript merging objects by id

前端 未结 16 1600
没有蜡笔的小新
没有蜡笔的小新 2020-11-22 09:43

What\'s the correct way to merge two arrays in Javascript?

I\'ve got two arrays (for example):

var a1 = [{ id : 1, name : \"test\"}, { id : 2, name :         


        
相关标签:
16条回答
  • 2020-11-22 10:24

    Vanilla JS solution

    const a1 = [{ id : 1, name : "test"}, { id : 2, name : "test2"}]
    const a2 = [{ id : 1, count : "1"}, {id : 2, count : "2"}]
    
    const merge = (arr1, arr2) => {
      const temp = []
    
      arr1.forEach(x => {
        arr2.forEach(y => {
          if (x.id === y.id) {
            temp.push({ ...x, ...y })
          }
        })
      })
    
      return temp
    }
    
    console.log(merge(a1, a2))
    
    0 讨论(0)
  • 2020-11-22 10:26

    Already there are many great answers, I'll just add another one which is from a real problem I needed to solve yesterday.

    I had an array of messages with user ids, and one array of users containing users' names and other details. This is how I managed to add user details to the messages.

    var messages = [{userId: 2, content: "Salam"}, {userId: 5, content: "Hello"},{userId: 4, content: "Moi"}];
    var users = [{id: 2, name: "Grace"}, {id: 4, name: "Janetta"},{id: 5, name: "Sara"}];
    
    var messagesWithUserNames = messages.map((msg)=> {
      var haveEqualId = (user) => user.id === msg.userId
      var userWithEqualId= users.find(haveEqualId)
      return Object.assign({}, msg, userWithEqualId)
    })
    console.log(messagesWithUserNames)
    
    0 讨论(0)
  • 2020-11-22 10:27

    reduce version.

    var a3 = a1.concat(a2).reduce((acc, x) => {
        acc[x.id] = Object.assign(acc[x.id] || {}, x);
        return acc;
    }, {});
    _.values(a3);
    

    I think it's common practice in functional language.

    0 讨论(0)
  • 2020-11-22 10:30

    If you have exactly the same number of items in both array with same ids you could do something like this.

    const mergedArr = arr1.map((item, i) => {
      if (item.ID === arr2[i].ID) {
        return Object.assign({}, item, arr2[i]);
      }
    });
    
    0 讨论(0)
  • 2020-11-22 10:31

    You can write a simple object merging function like this

    function mergeObject(cake, icing) {
        var icedCake = {}, ingredient;
        for (ingredient in cake)
            icedCake[ingredient] = cake[ingredient];
        for (ingredient in icing)
            icedCake[ingredient] = icing[ingredient];
        return icedCake;
    }
    

    Next, you need to do use a double-loop to apply it to your data structre

    var i, j, a3 = a1.slice();
    for (i = 0; i < a2.length; ++i)                // for each item in a2
        for (j = 0; i < a3.length; ++i)            // look at items in other array
            if (a2[i]['id'] === a3[j]['id'])       // if matching id
                a3[j] = mergeObject(a3[j], a2[i]); // merge
    

    You can also use mergeObject as a simple clone, too, by passing one parameter as an empty object.

    0 讨论(0)
  • 2020-11-22 10:31
    function mergeDiffs(Schedulearray1, Schedulearray2) {
        var secondArrayIDs = Schedulearray2.map(x=> x.scheduleid);
        return Schedulearray1.filter(x=> !secondArrayIDs.includes(x.scheduleid)).concat(Schedulearray2);   
    }
    
    0 讨论(0)
提交回复
热议问题