Search code examples
ecmascript-6lodash

Lodash: Find and add an item in a multi-level Json based on a conditions


I am trying to add an item to "roles array" based on a condition.

My json:

[{
    "unitId": "2",
    name: "elizabeth",
    roles: [{
      "role": {
        "roleId": "2",
        roleName: "testing"
      }
    }, {
      "role": {
        "roleId": "5",
        roleName: "dev"
      }
    }]
  },
  {
    "unitId": "3",
    name: "peter",
    roles: [{
      "role": {
        "roleId": "1",
        roleName: "testing"
      }
    }, {
      "role": {
        "roleId": "2",
        roleName: "dev"
      }
    }]
  }
]

let newRole = { "role":{"roleId" : "6", roleName: "BA"}}

Expected result: After adding the newRole to the roles array.

[{
    "unitId": "2",
    name: "elizabeth",
    roles: [{
      "role": {
        "roleId": "2",
        roleName: "testing"
      }
    }, {
      "role": {
        "roleId": "5",
        roleName: "dev"
      }
    }, {
      "role": {
        "roleId": "6",
        roleName: "BA"
      }
    }]
  },
  {
    "unitId": "3",
    name: "peter",
    roles: [{
      "role": {
        "roleId": "1",
        roleName: "testing"
      }
    }, {
      "role": {
        "roleId": "2",
        roleName: "dev"
      }
    }]
  }
]

Here for unitId: 2, I am trying to add a newRole to the "roles array". I tried lodash's filter and push, but it didn't work.


Solution

  • If I understand correctly, you are trying to add a new role based on the "unitId". Hope this helps.

    const a = [{
        "unitId": "2",
        name: "elizabeth",
        roles: [{"role": {"roleId": "2", roleName: "testing"}}, {"role": {"roleId": "5", roleName: "dev"}}]
    }, {
        "unitId": "3",
        name: "peter",
        roles: [{"role": {"roleId": "1", roleName: "testing"}}, {"role": {"roleId": "2", roleName: "dev"}}]
    }];
    
    const newRole = { "role":{"roleId" : "6", roleName: "BA"}};
    
    const insert = (arr, id, newRole) => {
    
        const whereToPush = arr.find((item) => item.unitId === id);
    
        if (whereToPush) whereToPush.roles.push(newRole);
    };
    
    insert(a, '2', newRole);
    
    console.log(a);