Search code examples
javascriptlodash

How to access parent and matched children object with Lodash?


I want to get parent object value and all the childs who has ischecked flag true with lodash.

Here is what I have so far:

responsetable = [{
  "Qty": 3,
  "List1": [],
  "List2": [
    {
      "serialNumber": "1",
       "ischecked":false
    },
    {
      "serialNumber": "2",
       "ischecked":true
    },
    {
      "serialNumber": "3",
       "ischecked":false
    }
  ],
  "lineItemId": 50,
  "lineItemQty": 3,
},
]


const filter = _.filter(this.responsetable, function (item) {
 return  _.some(item.List2, { 'ischecked': true });
});

console.dir(filter)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.core.min.js"></script>

here from this json i want to check which all children has ischecked true only those children i want to display with object value. This is what i have tried so far but its returning me all the serial number objects not the one which has ischecked flag set to true

from this json i want qty ,lineitemid and lineitemqty along with matched child. Expected output is

   [{
    "Qty": 3,
    "List1": [],
    "List2": [

      {
        "serialNumber": "2",
         "ischecked":true;
      },
    ],
    "lineItemId": 50,
    "lineItemQty": 3,
  },
  ]      

Solution

  • You probably don't need lodash for this. filter map and some are all built into javascript.

    It is not particularly easy from your question to know exactly what you need, but here is a best guess if you want to only take those objects which have at least one ischecked value in one of their lists:

    const responsetable = [{
      "Qty": 3,
      "List1": [],
      "List2": [
        {
          "serialNumber": "1",
           "ischecked":false
        },
        {
          "serialNumber": "2",
           "ischecked":true 
        },
        {
          "serialNumber": "3",
           "ischecked":false
        }
      ],
      "lineItemId": 50,
      "lineItemQty": 3,
    },
    {
      "Qty": 5,
      "List1": [
        {
          "serialNumber": "1",
           "ischecked":true
        },
        {
          "serialNumber": "2",
           "ischecked": false
        },
        {
          "serialNumber": "3",
           "ischecked":false
        }
      ],
      "List2": [
        
      ],
      "lineItemId": 51,
      "lineItemQty": 100,
    }
    ]
    
    const listHasACheckedSerial = list => list.some(listItem => listItem.ischecked)
    
    const getResponseObjectLists = responseObject => Object.keys(responseObject)
      .filter(key => key.indexOf('List') > -1)
      .map(key => responseObject[key])
    
    const responseObjectHasCheckedList = responseObjectIn => getResponseObjectLists(responseObjectIn)
      .map(list => listHasACheckedSerial(list))
      .some(v => !!v)
    
    const getRequiredResponseObjectProperties = responseObject => ({
      Qty: responseObject.Qty,
      List1: responseObject.List1.filter(item => item.ischecked),
      List2: responseObject.List2.filter(item => item.ischecked),
      lineItemId: responseObject.lineItemId,
      lineItemQty: responseObject.lineItemQty,
    })
    
    const filter = responseObjects => responseObjects
      .filter(responseObject => responseObjectHasCheckedList(responseObject))
      .map(responseObject => getRequiredResponseObjectProperties(responseObject))
    
    const test = getResponseObjectLists(responsetable[0])
    const result = filter(responsetable)
    
    console.dir(result)

    However if you only want to check items in List2:

    const responsetable = [{
      "Qty": 3,
      "List1": [],
      "List2": [
        {
          "serialNumber": "1",
           "ischecked":false
        },
        {
          "serialNumber": "2",
           "ischecked":true 
        },
        {
          "serialNumber": "3",
           "ischecked":false
        }
      ],
      "lineItemId": 50,
      "lineItemQty": 3,
    },
    {
      "Qty": 5,
      "List1": [],
      "List2": [
        {
          "serialNumber": "1",
           "ischecked":false
        },
        {
          "serialNumber": "2",
           "ischecked": false
        },
        {
          "serialNumber": "3",
           "ischecked":false
        }
      ],
      "lineItemId": 51,
      "lineItemQty": 100,
    }
    ]
    
    const getRequiredResponseObjectProperties = responseObject => ({
      Qty: responseObject.Qty,
      List1: responseObject.List1.filter(item => item.ischecked),
      List2: responseObject.List2.filter(item => item.ischecked),
      lineItemId: responseObject.lineItemId,
      lineItemQty: responseObject.lineItemQty,
    })
    
    const filter = responseObjects => responseObjects
      .filter(r => r.List2
        .map(l => l.ischecked)
        .some(v => !!v)
      )
      .map(r => getRequiredResponseObjectProperties(r))
      
    console.dir(filter(responsetable))