How do I find a value in a parent key of a specific child in a JSON data set? My JSON data looks something like this:
DATA = { "result":"Ok", "data":[{ "orderNumber":"Order1", "anyKey":"something else", "samples":[{ "sampleNumber":"sample1", "anyOtherKey":"something", "item123":"abc 123" },{ "sampleNumber":"sample2", "anyOtherKey":"something", "item123":"def 123" }], "tests":[{ "testNumber":"DP2200200-01", "testTypeName":"testtype1" }] },{ "orderNumber":"Order2", "anyKey":"something", "samples":[{ "sampleNumber":"sample2", "anyKey":"something", }], "tests":[{ "testNumber":"test2", "testTypeName":"testtype2" }] },{ "orderNumber":"Order3", "anyKey":"something", "samples":[{ "sampleNumber":"sample1", "anyOtherKey":"something", "item123":"xyz 123" }] } ]}
I need a way to search for string (like abc
) inside item123
and return the OrderNumber belonging to it. So far I did look it up by
let keyword = "abc" let mydata = DATA.data.find(order => order.samples.find(sam => sam.item123.includes(keyword))); if ( typeof mydata == 'undefined') { document.getElementById("orderNumber").innerHTML = "nothing found :-("; } else { var myOutput = mydata ["orderNumber"]; document.getElementById("orderNumber").innerHTML = myOutput ; }
This works fine as long as the child has the item123
, so it works for Order1 but fails for Order3, because Order2 does not have the item123
. However some sets don’t have this property.
Another drawback is that it only finds the first occurrence. How can I find all occurrences and return the associated sampleNumber as well?
Advertisement
Answer
First you need to filter out the objects
const filteredData = DATA.data.filter(d => d.samples.find(s => s?.item123?.includes('abc')));
You can then extract the value you need. Here i am extracting orderNumber.
const orderNumbers = filteredData.map(fd => fd.orderNumber);
You can even use flatMap instead of filter and map to filter and extract in the same loop.