Изменить свойство объекта объекта внутри массива внутри другого массива - PullRequest
0 голосов
/ 01 мая 2020

На самом деле я уже сделал это, но я уверен, что вы можете сделать это с ES6.

Не имеет значения ваши логики c, цель состоит в том, чтобы найти какой-то объект во вложенных массивах и изменить данные (изменить свойство объекта):

let selectedItem = { LinkID: 1 }; // item to be changed inside my vuex store

//sindecs is a property inside my vuex store

let sindecs = [
  {
    estado: { id: 2, siga: "AL", nome: "Alagoas" },
    uf: { id: 2, nome: "SP" },
    link: [
      { LinkID: 1, Link: "link1", Active: false },
      { LinkID: 2, Link: "link 2", Active: false }
    ],
    SindecID: 3
  },
  {
    estado: { id: 19, siga: "RJ", nome: "Rio de Janeiro" },
    uf: { id: 1, nome: "RJ" },
    link: [{ LinkID: 3, Link: "rio", Active: false }],
    SindecID: 4
  }
];



//this is the for inside my mutations, I want to change here to a easier way to change the value.
for (let i = 0; i < sindecs.length; i++) {
  for (let j = 0; j < sindecs[i].link.length; j++) {
    if (sindecs[i].link[j].LinkID === selectedItem.LinkID) {
      sindecs[i].link[j].Active = !sindecs[i].link[j].Active;
    }
  }
}

Заранее большое спасибо.

1 Ответ

1 голос
/ 01 мая 2020

Похоже на ES6. Это просто clean syntax.

const toggleState = (sindecs, id) => {
  sindecs.forEach((sinde) => {
    const link = sinde.link.find((s) => s.LinkID === id);
    if (link) link.Active = !link.Active;
  });
};
toggleState(sindecs, selectedItem.LinkID)

То же, что и выше, но good in performance. Если есть только one match, это не будет iterate всех данных. Это будет break loop.

const toggleState = (sindecs, id) => {
  let link;
  sindecs.some((sinde) => {
    link = sinde.link.find((s) => s.LinkID === id);
    return Boolean(link);
  });
  if (link) link.Active = !link.Active;
};
toggleState(sindecs, selectedItem.LinkID);

Демо:

const toggleState = (sindecs, id) => {
  let link;
  sindecs.some((sinde) => {
    link = sinde.link.find((s) => s.LinkID === id);
    return Boolean(link);
  });
  if (link) link.Active = !link.Active;
};

let selectedItem = { LinkID: 1 }; 
let sindecs = [{"estado":{"id":2,"siga":"AL","nome":"Alagoas"},"uf":{"id":2,"nome":"SP"},"link":[{"LinkID":1,"Link":"link1","Active":false},{"LinkID":2,"Link":"link 2","Active":false}],"SindecID":3},{"estado":{"id":19,"siga":"RJ","nome":"Rio de Janeiro"},"uf":{"id":1,"nome":"RJ"},"link":[{"LinkID":3,"Link":"rio","Active":false}],"SindecID":4}];
toggleState(sindecs, selectedItem.LinkID);
console.log(JSON.stringify(sindecs, null, 2)) // update..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...