(Angular 5) - Почему for of typescript принимает только последнее число

Я работаю с angular 5, и у меня есть два массива внутри моего компонента:

Массив данных

data = [{...},{...}]

Массив чисел

inputData = [{1,2,3},{4,5,6}]

поэтому проблема в том, что я хочу изменить некоторые значения внутри массива data на значения внутри inputData.

Для этого я использую итератор следующим образом:

for (let x in this.data) {
  this.result = this.data[x].ranges;

  for (let y in this.result) {

    for (let z of this.inputData) {
      this.data[x].ranges[y].ph = z;
    }
  }
}

Проблема в том, что итератор for выполняет все операции по изменению этих значений, но когда я помещаю console.info(data), массив данных имеет только последнее значение (3) inputData:

    [ 
      { "name": "Low", "ph": 3, "day": 0 },  <- Check the ph value
      { "name": "Medium", "ph": 3, "day": 0 }, <- Check the ph value
      { "name": "High", "ph": 3, "day": 0 }  <- Check the ph value
    ]

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

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените in на of.

'of' выполняет итерацию по объектам, таким как массив.

'in' выполняет итерацию по свойствам объекта.

Вот два примера:

Кроме того, я посмотрел на ваш stackblitz ... логика не совсем правильная. Попробуй это:

  constructor() {
    for (let x of this.data) {
      this.result = x.ranges;

      for (let y in this.result) {
          this.result[y].ph = this.inputValues[y];
      }
    }
  }

Вот форк вашего stackblitz: https://stackblitz.com/edit/angular-ckdrqe?file=src/app/app.component.ts

Ваш исходный код:

for (let x in this.data) {
  this.result = this.data[x].ranges;

  for (let y in this.result) {

    for (let z of this.inputValues) {
      this.data[x].ranges[y].ph = z;
    }
  }
}

Первый цикл перебирает данные по индексу. Это намного проще сделать по значению, как показано в моей копии вашего кода выше.

Второй цикл перебирает все результаты по индексу ... затем для каждого результата он обновляет .phнесколько раз, потому что в этом цикле вы просматриваете все inputValues. Вот почему всегда получается последнее значение.

Есть разница между forin и for в javascript / typescript. forin - это не то же самое, что, скажем, foreach на C# или PHP.

let myObject = {a: 1, b: 2, c: 3};
for(let keys in myObject) {
  // goes through all the keys of an object (i.e. a,b,c)
}

let myArray = [1,2,3];
for(let i = 0; i < myArray.length; i++) {
  // goes through the indexes of an enumerable array (i.e. 0,1,2)
}
// Alternatively, you could also use 
myArray.forEach((value, index, array) => {
   // lists all the values  
}

Просто кажется, что вы еще не до конца понимаете forin. Пойдите, проверьте документ:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

https://www.w3schools.com/js/js_loop_for.asp

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

Ах да и forofdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Simon Corcos 25.07.2018 03:07

Я внес некоторые изменения в stackblitz. Вы можете проверить это?

Jorge Najera 25.07.2018 05:07

Другие вопросы по теме