.forEach для массива с объектами не будет работать - PullRequest
0 голосов
/ 16 октября 2018

Итак, сейчас я разрабатываю систему, в которой учащиеся могут ставить свои отметки в форме, которая будет запускать функцию, которая помещает все отметки внутри массива как объект.

Как: {english_period1: 10, english_period2: 7} <Пример </p>

Но, если я хочу запустить array.prototype.forEach, чтобы что-то сделать с метками внутри массива.Это абсолютно ничего не возвращает..ForEach даже не запускается.

Это скрипт:

// Make new variable which will store the marks
let allMarks = [];

document.querySelector("#marks").addEventListener('submit', e => {
  e.preventDefault();

  //Execute for each input
  for(let i = 0; i < e.srcElement.length-1; i++){
    // Assign name and value
    const name = e.srcElement[i].name;
    const value = e.srcElement[i].value;

    //Check if value is a mark (number)
    if(value % 1 == 0 && value <= 10){
      //Assign mark
      allMarks[name] = value;
    }else{
      //Value is not a mark, check if it's a O, V or G
      if(value == "O" || value == "V" || value == "G"){
        allMarks[name] = value;
      }else{
        console.log("Niet toegestaan");
      }
    }
  }

  allMarks.forEach(mark => {
    console.log("hello world");
  });

},false);

Что он делает:

  1. После того, как пользователь поставил свои отметки и щелкнул и отправил форму
  2. Просмотрите все входные данные в форме и поместите имя плюс значение в качестве объекта в массиве.
  3. Просмотрите каждую вещь внутри массива и напечатайте «hello world» в консоли.

Цель сценария - вычислить средние оценки учеников и проверить их по некоторым правилам, чтобы определить, сдают ли они школьный год.

Что я делаю не так?Разве нельзя использовать array.prototype.forEach над массивом, который содержит объекты?Как я могу оптимизировать этот кусок кода?

Заранее спасибо!

ОТВЕТ

Вместо использования: allMarks[name] = value, который не добавитэлемент в массив allMarks = [].Использование allMarks.push({name: name, value: value}); поможет.Потому что теперь он будет добавлять элемент в массив (объект), и, таким образом, forEach может перебирать каждый элемент и получать его значения как обычный объект.

Особая благодарность: @ mhodges

LONG ANSWER

Поэтому после отладки, написав больше скриптов, я пришел к выводу, что с помощью объектакак некоторые предложили в ответах ниже, это лучший, более красивый вариант.

Можно динамически добавлять ключи к объекту, используя objectName[variableName].С помощью Object.keys(objectName) вы можете перебрасывать ключи в массив и перебирать их.Это приведет (в моем случае) к более красивой структуре данных:

Вместо: [{field: "English", period: "period_1", mark: "7.5"}] Это вернет:

"English": {
 "period_1": 7.5,
 "period_2": 6.4
}

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

forEach будет работать с массивами, но индекс массива должен быть числовым (целочисленное значение).

0 голосов
/ 16 октября 2018

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

например.

var allMarks = {};

, а внутри вы можете использовать

var marks;
marks.name = name;
marks.value = value;
allMarks.push(marks);

тогда вы можете использовать

allMarks.forEach(function(mark){
  console.log(mark.name);
  console.log(mark.value);
});
0 голосов
/ 16 октября 2018

Ваш allMarks[name] = value превращает массив allMarks в массив с буквальными свойствами (с поведением объекта), .forEach() не будет работать с этим.Вы можете использовать allMarks как объект:

let allMarksKeys = Object.keys(allMarks); 
allMarksKeys.forEach(key => // for example use allmarks[key] to access object elements)

и т. Д.

0 голосов
/ 16 октября 2018

Обратите внимание, что немного сложно сказать, что именно вы пытаетесь сделать здесь.Если вам нужно allMarks в качестве массива, то вам нужно добавить каждого отдельного mark в массив allMarks, как показано ниже:

// Make new variable which will store the marks
let allMarks = [];

document.querySelector("#marks").addEventListener('submit', e => {
  e.preventDefault();

  //Execute for each input
  for(let i = 0; i < e.srcElement.length-1; i++){
    // Assign name and value
    const name = e.srcElement[i].name;
    const value = e.srcElement[i].value;
    // <-- create new mark object -->
    const newMark = {name: value}

    //Check if value is a mark (number)
    if(value % 1 == 0 && value <= 10){
      //Assign mark
      //<-- instead of allMarks[name] = value; -->
      //<-- you need to add the newMark to the allMarks array -->
      allMarks.push(newMark);
    }else{
      //Value is not a mark, check if it's a O, V or G
      if(value == "O" || value == "V" || value == "G"){
        //<-- same thing here -->
        allMarks.push(newMark);
      }else{
        console.log("Niet toegestaan");
      }
    }
  }

  allMarks.forEach(mark => {
    console.log("hello world");
  });

},false);

Однаковместо этого вы можете сделать allMarks объектом, а затем установить каждый отдельный mark в качестве пары ключ-значение для этого объекта.Вы по-прежнему сможете проходить по парам ключ-значение в объекте, но вы не сможете использовать .forEach.

Что бы вы предпочли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...