Цикл Java script через массив объектов

#javascript #html #arrays #json #vue.js

#javascript #HTML #массивы #json #vue.js

Вопрос:

У
меня есть java-скрипт, массив объектов, считываемых из html-таблицы, как показано ниже, представляет номер строки, BranchId представляет номер столбца и значение, связанное с флажком (vue js v-model) 3 * 3 табличные данные:

  permissions=   [
    [{depId:1,branchId:1,val:true},{depId:1,branchId:2,val:true},{depId:1,branchId:3}],
    [{depId:2,branchId:1},{depId:2,branchId:2},{depId:2,branchId:3}],
    [{depId:3,branchId:1},{depId:3,branchId:2},{depId:3,branchId:3,val:true}]
    ]
  

Мне нужно отправить эти данные в axios API, но данные должны быть в формате ниже

 data[0][branches][0]=1
data[0][branches][1]=2
data[0][department]=1  

data[1][branches][0]=3
data[1][department]=3
  

Я пробовал что-то подобное, но у него возникли проблемы (данные, отправленные в неправильных индексах)

 let data={};
   permissions.forEach((row, i) => {
      row.forEach((col, j) => {
        if (col["val"] === true) {
          data[`data[${i}][branches][${j}]`] = col.branchId;
          data[`data[${i}][department]`] = col.deptId;
        }
      });
    });
        console.log(data);
  

каким должен быть цикл для правильной отправки данных?

текущий результат

 "data[0][branches][0]": 1,
  "data[0][department]": 1,
  "data[0][branches][1]": 2,
  "data[2][branches][2]": 3,
  "data[2][department]": 3
  

Комментарии:

1. but it have problems в чем проблемы?

2. данные, отправленные с неправильными индексами @JaromandaX

3. Да, первая проблема: ваши индексы изменяются с 1 на 3 вместо 0 на 2.

4. Действительно ли ваша конструкция с повторной ссылкой на данные «data [ data[${i}][branches][${j}] ]» так, как вы хотите выполнить эту работу? Я даже не хочу этого понимать… это, конечно, плохая читаемость.

5. API, построенный таким образом @JanosVinceller

Ответ №1:

Вы забыли пару запятых в своем permissions объекте. Следующая проблема заключается в том, что вы пытались проверить наличие departmentId in permissions , но оно на самом деле depId есть. Следующее, что вам не нужно определять и отслеживать i , и j они удобно предоставляются вам в forEach функции в качестве второго аргумента, который передается запущенной функции.

Вот рабочая версия того, чего вы пытались достичь:

 permissions = [
  [{
    depId: 1,
    branchId: 1,
    val: true
  }, {
    depId: 1,
    branchId: 2,
    val: true
  }, {
    depId: 1,
    branchId: 3
  }],
  [{
    depId: 2,
    branchId: 1
  }, {
    depId: 2,
    branchId: 2
  }, {
    depId: 2,
    branchId: 3
  }],
  [{
    depId: 3,
    branchId: 1
  }, {
    depId: 3,
    branchId: 2
  }, {
    depId: 3,
    branchId: 3,
    val: true
  }]
]

let data = {};
let j = 0;

permissions.forEach((row) => {
  let i = 0;
  let departmentSeen = false;

  row.forEach((col) => {
    if (col["val"] === true) {
      data[`data[${j}][branches][${i}]`] = col.branchId;
      data[`data[${j}][department]`] = col.depId;
      i  ;
      departmentSeen = true;
    }
  });

  if (departmentSeen) {
    j  ;
  }
});

console.log(data);  

Комментарии:

1. данные в этом случае должны быть «данные [0] [ветви] [0]»: 1, «данные [0] [отдел]»: 1, «данные [0] [ветви] [1]»: 2, «данные [1] [ветви] [0]»: 3, «данные [1] [отдел]»: 3

2. индекс данных должен быть последовательным

3. Я не уверен, что вы подразумеваете под «индексом данных должна быть последовательность», можете ли вы уточнить?

4. вот так (из примера результата) «данные [1] [ветви] [0]»: 3, вместо «данные [2] [ветви] [2]»: 3, @IvanD

5. Я отредактировал решение. Пожалуйста, обратите внимание, что на выходе будет другой порядок элементов, но элементы будут одинаковыми. Это то, чего вы пытались достичь?