将相同的值分配给对象

时间:2020-09-25 10:53:30

标签: javascript arrays angular

嗨,我正在尝试为单个对象中的多个动态数组和嵌套数组分配一个值。

这里是对象:

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",
    },

  ]
}

下面是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",
    },

  ]
}

在上述对象中,分配了一个新值“ isDisabled:true”,该值被分配给所有数组以及内部或嵌套数组。

无论有多少个数组或嵌套的数组,如何为多个动态数组分配值

3 个答案:

答案 0 :(得分:0)

那里没有魔术。
您应该只编写简单的递归。
这样的东西应该可以工作(伪代码):

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

  return obj;
}

[更新]

有效的解决方案(结果与用户要求的相同100%)

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;
}

答案 1 :(得分:0)

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;
  }
 }
})

答案 2 :(得分:0)

编辑:错过了问题中的“嵌套数组”部分。

尝试

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;
  }
}

用法

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

运行以下代码段进行演示

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>