简体   繁体   中英

Assign same value to multiple array in object

Hi i am trying to assign a single value to multiple dynamic array and nested array in single object.

here is here object:

 object = { metaForm: [{ id: 1, text: 'abc', AdditionalVal: [] }, { id: 1, text: 'abc', AdditionalVal: [{ id: 1, text: 'add', compositeConfig: [] }, ] }, { id: 1, text: 'abc', AdditionalVal: [{ id: 1, text: '123', compositeConfig: [{ id: 1, text: 'composit', compositeConfig: [] }] }, ] } ], tabData: [{ composite: false, compositeFieldList: [], id: 3576, tenantId: "1", }, { composite: false, compositeFieldList: [{ id: 1, text: 'composit2', compositeConfig: [] }, { id: 1, text: 'composit3', compositeConfig: [] }, ], id: 3576, tenantId: "1", }, ] }

Below is the o/p

 object = { metaForm: [{ id: 1, text: 'abc', AdditionalVal: [], isDisabled: true, }, { id: 1, text: 'abc', isDisabled: true, AdditionalVal: [{ id: 1, text: 'add', isDisabled: true, compositeConfig: [] }, ] }, { id: 1, text: 'abc', isDisabled: true, AdditionalVal: [{ id: 1, text: '123', isDisabled: true, compositeConfig: [{ id: 1, text: 'composit', isDisabled: true, compositeConfig: [] }] }, ] } ], tabData: [{ composite: false, compositeFieldList: [], id: 3576, isDisabled: true, tenantId: "1", }, { composite: false, isDisabled: true, compositeFieldList: [{ id: 1, text: 'composit2', isDisabled: true, compositeConfig: [] }, { id: 1, text: 'composit3', isDisabled: true, compositeConfig: [] }, ], id: 3576, tenantId: "1", }, ] }

In the Above object a new value is assigned that is "isDisabled: true" which is assigned to all the arrays as well as inner or nested array.

How to assign value to multiple dynamic arrays no matter how many arrays are there or nested arrays

There's no magic way there.
You should just write simple recursion.
Something like this should work (pseudocode):

function traverseAndSetDisabled(obj) {
  if(Array.isArray(obj)) {
    for(child in obj) obj[child] = traverseAndSetDisabled(child)
  } else {
    obj.isDisabled = true;
  }

  return obj;
}

[UPDATE]

Working solution (result is 100% the same as user requested)

function traverseAndSetDisabled(obj) {
  if(typeof obj === 'object') {
    for(const child in obj) obj[child] = traverseAndSetDisabled(obj[child])
    if(!Array.isArray(obj)) {
      obj.isDisabled = true;
    }
  }

  return obj;
}
object.metaForm.forEach(i => {
 i.isDisabled = true;
 if(i.AdditionalVal.length){
  i.AdditionalVal.forEach(v => {
    if.isDisabled = true;
  })
 }
});
object.tabData.forEach(i => {
 i.isDisabled = true;
 if(i.compositeFieldList.length){
  i.compositeFieldList.forEach(c => {
   c.isDisabled = true;
  }
 }
})

Edit: Missed the "nested arrays" part in the question.

Try this :

function setProperty(object, key, value) {
  if(Array.isArray(object)){
    let newArray = [];
    object.forEach((obj, index) => {
      newArray.push(setProperty(obj, key, value));
    });
    return newArray;
  } else if(typeof object === 'object' && object != null) {
    object[key] = value;
    Object.entries(object).forEach(item => {
      if(Array.isArray(item[1])) {
        let listKey = item[0];
        let newList = setProperty(item[1], key, value);
        object[listKey] = newList;
      }
    });
    return object;
  }
}

Usage

setProperty(object, "isDisabled", true);
setProperty(object, "isDisabled", false);
setProperty(object, "someKey", "Some Value");

Run the following code snippet for a demo

 function setProperty(object, key, value) { if (Array.isArray(object)) { let newArray = []; object.forEach((obj, index) => { newArray.push(setProperty(obj, key, value)); }); return newArray; } else if (typeof object === 'object' && object != null) { object[key] = value; Object.entries(object).forEach(item => { if (Array.isArray(item[1])) { let listKey = item[0]; let newList = setProperty(item[1], key, value); object[listKey] = newList; } }); return object; } } function changeProp() { let object = { metaForm: [{ id: 1, text: 'abc', AdditionalVal: [] }, { id: 1, text: 'abc', AdditionalVal: [{ id: 1, text: 'add', compositeConfig: [] }, ] }, { id: 1, text: 'abc', AdditionalVal: [{ id: 1, text: '123', compositeConfig: [{ id: 1, text: 'composit', compositeConfig: [] }] }, ] } ], tabData: [{ composite: false, compositeFieldList: [], id: 3576, tenantId: "1", }, { composite: false, compositeFieldList: [{ id: 1, text: 'composit2', compositeConfig: [] }, { id: 1, text: 'composit3', compositeConfig: [] }, ], id: 3576, tenantId: "1", }, ] }; document.getElementById("old").innerHTML = JSON.stringify(object, null, 4); let name = document.getElementById("propertyName").value; if (name == null || name == "") name = "isDisabled" setProperty(object, name, true); document.getElementById("result").innerHTML = JSON.stringify(object, null, 4); }
 <div> <h3> Enter the name of the property and click on the <strong>Set Property</strong> button.<br/> Default name is <i>isDisabled</i></h3> <input type="text" id="propertyName" name="propertyName" placeholder="Property name" /> <button onclick="changeProp();">Set Property</button> <h2>Object</h2> <pre id="old"> </pre> <br/> <h2>Updated</h2> <pre id="result"> </pre> </div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM