1

I am working on one problem when I have one dynamic nested array of similar kind of objects. I have to capture the nested indexes convert it to nested object. Here is the example of two level nested array and I have written simple code to convert it to nested index object. I am looking for iterative or recursive method to handle dynamic nested array and convert to nested similar index object:-

var arr= [
 {
 "index": "1",
 "subRows": [
 {
 "index": "2",
 "subRows": undefined
 },
 {
 "index": "3",
 "subRows": undefined
 }
 ]
 },
 {
 "index": "4",
 "subRows": [
 {
 "index": "5",
 "subRows": undefined
 }
 ]
 }
];
var obj={}
for(var i =0; i<arr.length; i++) {
 obj[i]={};
 if(arr[i].subRows) {
 for(var j=0; j<arr[i].subRows.length; j++) {
 obj[i][j] = {};
 }
 }
}
console.log(obj)

Heretic Monkey
12.2k7 gold badges63 silver badges133 bronze badges
asked May 4, 2021 at 20:31
7
  • You have no JSON in your question, and there is no such thing as a JSON Object. Just arrays and objects. Commented May 4, 2021 at 20:34
  • Seems like you probably need to write a recursive function. Commented May 4, 2021 at 20:35
  • Can you give an example of the result obj would look like? Commented May 4, 2021 at 20:36
  • @MotiKorets the out put will be like this, you can also run this code.0: {0:{0:{},1:{}}, 1:{0:{}}} Commented May 4, 2021 at 20:38
  • it will be more understandable if you add the desired output to the question Commented May 4, 2021 at 20:40

3 Answers 3

4

one simple recursive approach

var arr = [{
 "index": "1",
 "subRows": [{
 "index": "2",
 "subRows": undefined
 },
 {
 "index": "3",
 "subRows": undefined
 }
 ]
 },
 {
 "index": "4",
 "subRows": [{
 "index": "5",
 "subRows": undefined
 }]
 }
];
let obj = {
 ...arr.map(function convert(obj) {
 return { 
 ...obj.subRows?.map(convert)
 }
 })
};
console.log(obj)
.as-console-wrapper{top:0;max-height:100%!important}

answered May 4, 2021 at 20:47
Sign up to request clarification or add additional context in comments.

2 Comments

TIL ({ ...undefined }) is valid but [ ...undefined ] is not
@Thankyou: it would be convenient if [...undefined] acted like [...([])], but I think I understand why it's not done that way... a question of parametricity, one that doesn't apply in the Object case.
2

You could just assign the result of the recursive call to the parent level.

const
 convert = array => array.reduce((o, { subRows = [] }, index) => {
 o[index] = convert(subRows);
 return o;
 }, {}),
 array = [{ index: "1", subRows: [{ index: "2", subRows: undefined }, { index: "3", subRows: undefined }] },{ index: "4", subRows: [{ index: "5", subRows: undefined }] }],
 result = convert(array);
console.log(result);

answered May 4, 2021 at 20:41

4 Comments

I don't want to use that index, but actual index.
This looks great. Thanks
please try it. it should work, because it works for the second level without specifying.
I verified, it works for any nesting level. Thanks
0

Here is an iterative solution using object-scan.

// const objectScan = require('object-scan');
const myArr = [{ index: '1', subRows: [{ index: '2', subRows: undefined }, { index: '3', subRows: undefined }] }, { index: '4', subRows: [{ index: '5', subRows: undefined }] }];
const extract = (arr) => objectScan(['**(^subRows$)'], {
 reverse: false,
 useArraySelector: false,
 breakFn: ({ key, property, context }) => {
 if (!Number.isInteger(property)) {
 return;
 }
 context.length = Math.ceil(key.length / 2);
 const last = context[context.length - 1];
 last[property] = {};
 context.push(last[property]);
 }
})(arr, [{}])[0];
console.log(extract(myArr));
// => { '0': { '0': {}, '1': {} }, '1': { '0': {} } }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/[email protected]"></script>

Disclaimer: I'm the author of object-scan

answered May 6, 2021 at 3:10

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.