Присвойте новый ключ каждому объекту в массиве с уникальным идентификатором на основе индекса объекта в массиве - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь назначить новый ключ каждому объекту в массиве с уникальным идентификатором на основе индекса объекта в массиве.

, когда я нажимаю кнопку, он запускается

    this.setState({ testStatus: "running", clicked: true });
    tests.map(test => {
      test.run(x =>
        this.setState({
          testStatus: {
            ...this.state.testStatus,
            [test.id]: x ? "passed" : "failed"
          }
        })
      );
    });

каждый тест имеет рандомизированную задержку и случайный логический результат. Когда я console.log -> testStatus

, он регистрирует следующее

0: "r"
1: "u"
2: "n"
3: "n"
4: "i"
5: "n"
6: "g"
undefined: "passed" <<<<---- variable outcome | undefined is what I want to have a unique id
**The array**
const tests = [
    { description: "Gochujang small batch live-edge green juice photo booth pinterest.",          run: testsResult() },
    { description: " DIY shaman narwhal before they sold out chambray aesthetic.",         run: testsResult() },
    { description: "Tousled cliche master cleanse, cray chicharrones fixie skateboard", run: testsResult() },
    { description: "Fanny pack keffiyeh coloring book hashtag 90's synth.",         run: testsResult() },
    { description: "Hexagon enamel pin artisan drinking vinegar.",  run: testsResult() },
    { description: "Knausgaard semiotics fashion axe occupy health goth",       run: testsResult() },
  ];

Метод


  uniqueId() {
    let strKeys = Object.keys(tests);
    tests.map(test => {
      for (let index = 0; index < strKeys.length; index++) {
        let uniqId = (strKeys[index] = parseInt(strKeys[index]));
        Object.assign(test, { id: uniqId });
      }
    });
  }

метод вызывается с обработчиком события щелчка. например,

this.uniqueId();

перед установкой какого-либо состояния и т. п.

вместо назначения

регистрирует для каждого теста назначенное значение testStatus [test.id] дляиндексный ключ

вот так

0: "r"
1: "u"
2: "n"
3: "n"
4: "i"
5: "passed" (variable)
6: "g"

Может кто-нибудь указать на мою ошибочную логику?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Там нет test.id есть? или я что-то пропустил

также Object.assign предназначено для создания новой копии всех свойств объекта внутри, оно не изменяет ни один из объектов

Если вы пытаетесь изменить tests чтобы включить идентификатор, тогда я не уверен, что вам нужно let strKeys = Object.keys(tests); или for (let index = 0; index < strKeys.length; index++) { для хотя бы

, но

uniqueId() {
    let strKeys = Object.keys(tests);
    tests = tests.map(test => {
      let newTest = {};
      for (let index = 0; index < strKeys.length; index++) {
        let uniqId = (strKeys[index] = parseInt(strKeys[index]));
        newTest = Object.assign(test, { id: uniqId });
      }
      return newTest;
    });
  }

Я не собираюсь пытаться понять, почему вынужно let strKeys = Object.keys(tests); или for (let index = 0; index < strKeys.length; index++) { хотя.

Я чувствую, что это, вероятно, делает то же самое

uniqueId() {
    tests = tests.map((test, index) => {
        let uniqId = parseInt(index);
        return Object.assign(test, { id: uniqId });
    });
  }
0 голосов
/ 02 октября 2019

Код выглядит немного запутанным, но по крайней мере один очевидный момент -

в приведенном ниже коде нет смысла присваивать значение ключу id strKeys.length раз, потому что только последний из них будетназначаться после окончания цикла

for (let index = 0; index < strKeys.length; index++) {
    let uniqId = (strKeys[index] = parseInt(strKeys[index]));
    Object.assign(test, { id: uniqId });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...