Создать массив JavaScript в цикле For

#javascript

#javascript

Вопрос:

Я хочу создать приведенный ниже массив с циклом for в качестве большого

 var centres = {
    1979: { x: width * 1 / 41, y: height / 2 },
    1980: { x: width * 2 / 41, y: height / 2 },
    1981: { x: width * 3 / 41, y: height / 2 },
    ...
}
  

а затем получите к нему доступ следующим образом:

 function nodeYearPos(d) {
   return yearCenters[d.year].x;
}
  

У меня есть следующий код, но он задает только год…

   var yearCenters = Array.from(new Array(2020-1919 1), (x, i) => i   1919);
  for (year = 1919; year <= 2020; year  ) {
    coords = getCentres(year); // this returns an object in the form {x : x, y : y}
    yearCenters[year] = coords;
  }
  

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

1. используйте объект, а не массив. массивы проиндексированы на 0

2. yearCenters = Object.fromEntries(Array.from(new Array(2020-1919 1), (x, i) => [i 1919,null])); преобразуйте массив в объект, а затем задайте значения.

Ответ №1:

вы можете сделать так, как прокомментировал горак, но с помощью функции getCenters

 var yearCenters = Object.fromEntries(Array.from(new Array(2020-1919 1), (x, i) => [i   1919, getCenters(i   1919)]));
  

или вы также можете попробовать

 var yearCenters = {};
for (year = 1919; year <= 2020; year  ) {
  coords = getCenters(year);
  yearCenters[year] = coords;
}
  

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

1. Я использовал последнее предложение, поскольку это хорошо и понятно с созданием пустого объекта ({}) и последующим его заполнением.

Ответ №2:

Когда вы пытаетесь выполнить выборку по годам в yearCenters массиве (например yearCenters[year] ), это не сработает, поскольку год не является индексом в массиве.

Я бы посоветовал вам сначала преобразовать массив в объект JS, чтобы индексация по нему работала с годами.

Смотрите фрагмент ниже —

 // Create obejct from array
var yearCenters = Object.fromEntries(Array.from(new Array(2020-1919 1), (x, i) => [i   1919, null]))
     
// This loop remains same
for (year = 1919; year <= 2020; year  ) {
    coords = getCentres(year); // this returns an object in the form {x : x, y : y}
    yearCenters[year] = coords; 
}

// Mock function
function getCentres(year) {
  return {
    x: Math.random() * 100,
    y: Math.random() * 100
  }
}

console.log(yearCenters)