根据索引数组设置数组

时间:2020-05-27 12:17:56

标签: javascript arrays

我想基于索引列表在嵌套对象结构中设置一个布尔值

我要更新的数据如下:

let categories = [{
    "name": "Cat 1",
    "subs": [{
        "name": "Sub Cat 1.1",
        "subs": [],
        "checked": false
      },
      {
        "name": "Sub Cat 1.2",
        "subs": [],
        "checked": false
      }
    ],
    "checked": false
  },
  {
    "name": "Cat 2",
    "subs": [],
    "checked": false
  }
];

索引存储在数组中:

let categoryIndexs = [0,1]

因此基于categoryIndexs,我想将checked“ Sub Cat 1.2”的对象的name属性更改为true

这就像将数组[0,1]转换为categories[0].subs[1]并更新其checked属性一样。

到目前为止,我设法获得了值并分别进行编辑,但是如何直接更改categories变量?

  let categoryIndexs = [0,1]

  let tmp_array = categories;

  for(var i = 0; i < categoryIndexs.length;i++){
      if(i == 0){
        tmp_array = tmp_array[categoryIndexs[i]]
      } else {
        tmp_array = tmp_array.subs[categoryIndexs[i]]
      }
  }

  tmp_array.checked = true
  console.log(tmp_array)

解决方案必须是动态的,因此,如果“ Sub Cat 1.2”在其自己的subs数组中具有嵌套条目,则可以像categoryIndexs一样使用[0,1,0]访问它< / p>

3 个答案:

答案 0 :(得分:2)

您可以在一个循环中迭代给定的索引,同时像下面的函数一样深入数据结构:

function setChecked(categories, categoryIndexes) {
    let obj = null;
    for (let index of categoryIndexes) {
        obj = categories[index];
        categories = obj.subs;
    }
    obj.checked = true;
}

let categories = [{"name": "Cat 1","subs": [{"name": "Sub Cat 1.1","subs": [],"checked": false},{"name": "Sub Cat 1.2","subs": [],"checked": false}],"checked": false},{"name": "Cat 2","subs": [],"checked": false}];
setChecked(categories, [0,1]);
console.log(categories);

答案 1 :(得分:2)

您可以使用reduce来获取最后一个subs,直到最后一个subs并更新checked属性

let categories = [{"name": "Cat 1","subs": [{"name": "Sub Cat 1.1","subs": [],"checked": false},{"name": "Sub Cat 1.2","subs": [],"checked": false}],"checked": false},{"name": "Cat 2","subs": [],"checked": false}];
let categoryIndexs = [0, 1];

function update(categories, indices) {
  const last = indices.pop(); // remove the last
  const redued = indices.reduce((acc, i) => acc[i].subs, categories);
  redued[last].checked = true;
  return categories
}

console.log(update(categories, categoryIndexs))

答案 2 :(得分:2)

您可以通过查看迭代的索引来缩小数组,并获取subs或项。

const 
    getValue = (subs, indices) => indices.reduce(
        ({ subs }, i) => subs[i],
        { subs }
    );

let categories = [{ name: "Cat 1", subs: [{ name: "Sub Cat 1.1", subs: [], checked: false }, { name: "Sub Cat 1.2", subs: [], checked: false }], checked: false }, { name: "Cat 2", subs: [], checked: false }],
    indices = [0, 1];

console.log(getValue(categories, indices, 'subs'));