Home > database >  loop through an array and compare object values to combine respective arrays
loop through an array and compare object values to combine respective arrays

Time:09-01

Here is my array , I need to loop through this array and check if objects with same docId exists and if they do, I have to combine jArray of these objects

FinalArray = [
    {
        "jArray": [
            {
                "Cd": "A"
            }
        ],
        "Ref": {
            "docId": "123"
        },
        "name": "bene",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    },
    {
        "jArray": [
            {
                "Cd": "A"
            }
        ],
        "Ref": {
            "docId": "456"
        },
        "name": "leg",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    },
    {
        "jArray": [
            {
                "Cd": "B"
            }
        ],
        "documentRef": {
            "docId": "123"
        },
        "name": "bene",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    },
    {
        "jArray": [
            {
                "Cd": "B"
            }
        ],
        "Ref": {
            "docId": "456"
        },
        "name": "leg",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
  },
  {
        "jArray": [
            {
                "Cd": "A"
            }
        ],
        "Ref": {
            "docId": "789"
        },
        "name": "hello",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    }
]

expected result is as below.

[
    {
        "jArray": [
            {
                "Cd": "A"
        },
        {
                "Cd": "B"
        }
        ],
        "Ref": {
            "docId": "123"
        },
        "name": "bene",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    },
    {
        "jArray": [
            {
                "Cd": "A"
        },
        {
                "Cd": "B"
        }
        ],
        "Ref": {
            "docId": "456"
        },
        "name": "leg",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    },
  {
        "jArray": [
            {
                "Cd": "A"
            }
        ],
        "Ref": {
            "docId": "789"
        },
        "name": "hello",
        "check1": false,
        "check2": false,
        "check3": false,
        "check4": false,
        "id": "0001"
    }
]

any thoughts of how to achieve this ? how do i loop through an array and compare object values to combine respective arrays

I've been trying to do something like below. but can't figure out the right way

FinalArray.map((object, index) => {
          if (object.Ref.docId === FinalArray[index   1].Ref.docId) {
            const tempJArray = object.jArray.concat(FinalArray[index   1].jArray);
Object.assign(tempJArray , jArray);
            Object.assign({}, object.Ref.docId, FinalArray[index   1].Ref.docId);

          }
        });

CodePudding user response:

Much similar to a recent answer by me about "group array of objects by key" using reduce

var FinalArray = [{"jArray":[{"Cd":"A"}],"Ref":{"docId":"123"},"name":"bene","check1":false,"check2":false,"check3":false,"check4":false,"id":"0001"},{"jArray":[{"Cd":"A"}],"Ref":{"docId":"456"},"name":"leg","check1":false,"check2":false,"check3":false,"check4":false,"id":"0001"},{"jArray":[{"Cd":"B"}],"documentRef":{"docId":"123"},"name":"bene","check1":false,"check2":false,"check3":false,"check4":false,"id":"0001"},{"jArray":[{"Cd":"B"}],"Ref":{"docId":"456"},"name":"leg","check1":false,"check2":false,"check3":false,"check4":false,"id":"0001"},{"jArray":[{"Cd":"A"}],"Ref":{"docId":"789"},"name":"hello","check1":false,"check2":false,"check3":false,"check4":false,"id":"0001"}];

var before = JSON.stringify(FinalArray);


var obj = FinalArray.reduce(function(agg, item) {
  var docId = item.Ref && item.Ref.docId || "other"
  var copy = [...item.jArray];
  if (!agg[docId]) {
    agg[docId] = {
      jArray: [],
      Ref: { docId }, 
      name: item.name,
      id: item.id,
      // etc
    }
  }
  agg[docId].jArray = agg[docId].jArray.concat(copy)

  return agg;
}, {})

var result = Object.values(obj);
console.log(result)

var after = JSON.stringify(FinalArray);
console.log(before===after)
.as-console-wrapper {
  max-height: 100% !important;
}

CodePudding user response:

using lodash cloneDeep to copy obj

Above solution worked just fine. But , I only replaced if block code so i don't have to map object values manually (don't have to worry about other key value in the obj)

if (!agg[docId]) {
            agg[docId] = cloneDeep(item);
            agg[docId].jArray = [];
          }
  • Related