I'm trying to Iterate through a nested array and having trouble extracting the correct value.
My Json FIle
var regions = [
{
"id": 265592,
"longName": "Amsterdam 1",
"name": "ams01",
"statusId": 2,
"regions": [
{
"description": "AMS01 - Amsterdam",
"keyname": "AMSTERDAM",
"sortOrder": 0
}
]
},
{
"id": 814994,
"longName": "Amsterdam 3",
"name": "ams03",
"statusId": 2,
"regions": [
{
"description": "AMS03 - Amsterdam",
"keyname": "AMSTERDAM03",
"sortOrder": 26
}
]
},
{
"id": 1004997,
"longName": "Chennai 1",
"name": "che01",
"statusId": 2,
"regions": [
{
"description": "CHE01 - Chennai ",
"keyname": "CHENNAI",
"sortOrder": 30
}
]
},
I would like to extract only the Key name from the Regions Array into an Array.
MY code which works fine and gives me the output:
const regions3 = []
for (let i = 0; i < regions.length; i++) {
const element = regions[i];
const regions1 = (element.regions)
for (let j = 0; j < regions1.length; j++) {
const element1 = regions1[j];
const element2 = element1.keyname;
regions3.push(element2)
console.log(regions3)
}
}
Output
AMSTERDAM
AMSTERDAM03
CHENNAI
I would like to know if there a faster way to iterate rather than running it into two for loops??
Thank you
4 Answers 4
You can use Array.flatMap() (not supported in IE/Edge) with Array.map():
const regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}]
const result = regions.flatMap(o =>
o.regions.map(p => p.keyname)
)
console.log(result)
If you can't use Array.flatMap() you can use an external Array.map() and spread the results into Array.concat() instead:
const regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}]
const result = [].concat(...regions.map(o =>
o.regions.map(p => p.keyname)
))
console.log(result)
2 Comments
You can use .map() and destructuring assignment
var regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}];
let res = regions.map(({regions: [{keyname}]}) => keyname);
console.log(res);
3 Comments
"regions" where the value is an array of objects where the "keyname" is the property value that is destructured, which is similar to regions[0]['regions'][0]['keyname'], see Destructuring assignment Another solution for this is using Array::reduce():
var regions = [{"id":265592,"longName":"Amsterdam1","name":"ams01","statusId":2,"regions":[{"description":"AMS01-Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam3","name":"ams03","statusId":2,"regions":[{"description":"AMS03-Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai1","name":"che01","statusId":2,"regions":[{"description":"CHE01-Chennai","keyname":"CHENNAI","sortOrder":30}]}];
let res = regions.reduce(
(acc, curr) => (curr.regions.forEach(x => acc.push(x.keyname)), acc),
[]
);
console.log(res);
Comments
Well its pretty much the same thing but using a forEach method or array type in javascript can save you some time. here is an example.
const regions3 = [];
regions.forEach(function(region){
region.regions.forEach(function(subRegion){
regions3.push(subRegion.keyname);
console.log(subRegion.keyname);
})
});
a forEach executes an anonymous function passing each element in array as the argument to the anonymous function
regionsarray can contain more than one object. Maybe you could clarify in the question or your example data.