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,
},
]
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))