如何动态地将数组值作为对象传递?

时间:2019-04-09 03:56:52

标签: javascript arrays object

我需要将数组值视为对象的支持。例如:

let arr = ['masa_icerik', 'urunler', 0, 'urun_adet'];
let obj = {
  "_id": "5c13bd566704aa5e372dddcf",
  "masa_id": 3,
  "masa_numara": 3,
  "masa_magaza": 1,
  "masa_icon": "kola",
  "masa_adi": "salon 3",
  "masa_durum": 1,
  "masa_icerik": {
    "adisyon": "J1554745811908",
    "urunler": [{
      "urun_adet": 14,
      "urun_fiyat": 3,
      "urun_id": "5c16686b93d7b79ae6367864",
      "urun_odenen": 0
    }, {
      "urun_adet": 1,
      "urun_fiyat": 5,
      "urun_id": "5c16686b93d7b79ae6367865",
      "urun_odenen": 0
    }]
  },
  "masa_acilis": "2019-04-08T17:50:12.052Z",
  "masa_acan": "5c1eda01d1f4773110dd6ada"
};

我有一个数组和一个上面的对象,我想做这样的事情:

let res;
arr.forEach(elem => {
   res = obj[elem];
});

然后,我需要得到类似的东西:

obj['masa_icerik']['urunler'][0]['urun_adet']

值的数量是服务器动态的。那就是为什么我需要这样的东西。有什么办法吗?我需要更改该属性并返回更改后的obj。

4 个答案:

答案 0 :(得分:1)

您可以使用forEach循环遍历数组并将其存储到temp变量。如果所有元素都存在,它将更改值。

let arr = ['a', 'b', 'c'];
let obj = {'a':{'b':{'c':1}}};
let newValue = "NEW VALUE";

let temp = obj;
arr.forEach((o, i) => {
  if (i < arr.length - 1) temp = temp[o] || null;
  else if (temp !== null && typeof temp === "object" ) temp[o] = newValue;
});

console.log(obj);


如果数组的最后一部分缺少多个多个对象属性。

let arr = ['a', 'b', 'c', 'd'];
let obj = {'a': {'b': {}}};
let newValue = "NEW VALUE";

let temp = obj;
arr.forEach((o, i) => {
  if (i < arr.length - 1) {
    if (!temp[o]) temp[o] = {[arr[i + 1]]: {}};
    temp = temp[o];
  } else if (temp !== null && typeof temp === "object") temp[o] = newValue;
});

console.log(obj);

答案 1 :(得分:0)

您可以使用references

这里的想法是

  • 使用val参考初始化object
  • 遍历数组并继续设置对val的新引用

let arr = ['a','b','c'];
let obj = {'a':{'b':{'c':1}}};

let getMeValue = (arr) => {
  let val=obj;
  arr.forEach(e => val = val && val[e] )
  return val
}

console.log(getMeValue(arr))
console.log(getMeValue([1,2,3]))

  

更新:我想更改值

let arr = ['a','b','c'];
let obj = {'a':{'b':{'c':1}}};

let getMeValue = (arr) => {
  let val = obj
  arr.forEach((e,i) => {
  if(i === arr.length-1 && val){
    val[e] = 5
   }
  else {
  val = val && val[e]
  }
 })
 return obj
}

console.log(getMeValue(arr))

答案 2 :(得分:0)

我不完全了解您从何处获得新的价值,但是我认为这将使您走上正确的道路。

let newObj = {};

arr.map(each => {
   newObj[each] = "new value";
 })

console.log(newObj);

答案 3 :(得分:0)

我不确定您在这里的要求,我想您需要以下内容:

    let func = (arr, value)=>{
        r = {};
        r[arr[arr.length-1]] = value;
        for(let i = arr.length-2; i>=0; i--){
            obj = {};
            obj[arr[i]] = r;
            r = obj;
        }
        return r;
    }
    console.log(func(['a', 'b', 'c'], 1));