Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сгенерировать массив чисел (https://javascript.ru/forum/dom-window/62122-sgenerirovat-massiv-chisel.html)

AlexHutor 25.03.2016 15:40

Сгенерировать массив чисел
 
Здравствуйте!
Мне нужен большой массив чисел - это подряд годы с 1800 по 2010. Как мне этот массив сгенерировать, чтобы не забивать вручную все 211 годов? Прошу извинить за детский вопрос, я не специалист по JavaScript.

newcoolguru 25.03.2016 15:55

лучше так
arr = []
for(i = 1890; i <= 2010; i++) arr.push(i)
console.log(arr)

AlexHutor 25.03.2016 16:08

Спасибище!!!

AlexHutor 25.03.2016 16:33

Цитата:

Сообщение от newcoolguru (Сообщение 412008)
лучше так
arr = []
for(i = 1890; i <= 2010; i++) arr.push(i)
console.log(arr)

Придумал ещё
arr = new Array(211)
for (i = 0; i < 211; i++)
arr[i] = 1800+i

AlexHutor 09.04.2016 19:14

Здравствуйте!

Помогите решить задачу. Нужно создать массив чисел, в котором первое число задаётся мной (5.94), каждое следующее число получается путём умножения предыдущего числа на 1.059526. Всего в массиве должно получиться 88 чисел.

И вторая задача. На выходе число из этого массива должно быть с округлением до двух знаков после запятой. И это должны быть именно два знака, даже если число получится целым (например 1.00).

Заранее спасибо за помощь.

рони 09.04.2016 19:19

AlexHutor,
а чем новая задача отличается от прежней? может учебник почитать?
number#округление

Alexander Belov 09.04.2016 21:04

рони,
А в данном случае (задача на 88 чисел) можно использовать как-то reduce(), учитывая, что массива нет? С пустым массивом ведь функция не работает.

AlexHutor 09.04.2016 21:25

Цитата:

Сообщение от Alexander Belov (Сообщение 413679)
рони,
А в данном случае (задача на 88 чисел) можно использовать как-то reduce(), учитывая, что массива нет? С пустым массивом ведь функция не работает.


Спасибо, я нашёл для себя решение:
arr = new Array(88)
for (i = 0; i < 88; i++)
{arr[0] = 5.94
 if (i>0) arr[i] = arr[i-1]*1.059526}

рони 09.04.2016 22:04

AlexHutor,
зачем 88 раз заполнять нулевую ячейку? и зачем условие?

рони 09.04.2016 22:19

Цитата:

Сообщение от Alexander Belov
С пустым массивом ведь функция не работает.

сделай непустой :)

AlexHutor 09.04.2016 23:26

Цитата:

Сообщение от рони (Сообщение 413686)
AlexHutor,
зачем 88 раз заполнять нулевую ячейку? и зачем условие?

рони,
Вы можете предложить более лаконичное решение?

Осталась у меня одна проблема. После округления до двух знаков после запятой некоторые числа получились целые или с одним знаком после запятой, а хотелось бы иметь, к примеру, 1.70 вместо 1.7

рони 09.04.2016 23:32

AlexHutor,
var arr = [5.94];
for (var i = 1; i < 88; i++) {arr[i] = arr[i-1]*1.059526}

рони 09.04.2016 23:34

Цитата:

Сообщение от AlexHutor
а хотелось бы иметь, к примеру, 1.70 вместо 1.7

вам дали ссылку про округления, видимо вы плохо прочли.

AlexHutor 10.04.2016 00:25

Цитата:

Сообщение от рони (Сообщение 413695)
AlexHutor,
var arr = [5.94];
for (var i = 1; i < 88; i++) {arr[i] = arr[i-1]*1.059526}

рони,
спасибо большое!

С округлением тоже всё нормально, действительно невнимательно читал.

Alexander Belov 13.04.2016 20:04

Цитата:

Сообщение от рони (Сообщение 413689)
сделай непустой :)

var arr = new Array (88);

var result = arr.reduce(function(prev, next) {
   next = (prev * 1.059526);
   arr.push(next);
}, 5.94);

alert(arr);


Рони, помогите, пожалуйста, разобраться.

1. arr - создали пустой массив с длиной 88
2. В конце функции задали первое число в массиве (5.94)
3. Начали обрабатывать массив: каждое последующее число - это произведение предыдушего числа на 1.059526
4. Вычислили следующее число (next), добавили его в исходный массив -arr.push(next)
5. Вывели alert'ом получившийся массив arr - не получилось.

рони 13.04.2016 20:15

Alexander Belov,
где return??? но и он бесполезен так как
Цитата:

Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались.
это для всех встроенных методов перебора.
нужен пункт 1 сначала выполнить сделать не пустой массив

Alexander Belov 13.04.2016 20:22

рони,
var arr = new Array (88);
arr.push(5.94);
 
var result = arr.reduce(function(prev, next) {
   next = (prev * 1.059526);
   arr.push(next);
  
    return arr;
}, 5.94);
 
alert(arr);


Отредактировал предыдущий вариант. Срабатвает непонятно как-то.

Судя по статье вот тут, ожидаемо было увидеть в массиве изначально в качестве первой цифры 5.94, т.к. мы её добавили в конце (таблица и код сразу над секцией Examples в статье)

рони 13.04.2016 20:45

Alexander Belov,
<script>
var arr = new Array (88+1).join(" ").split("");
arr.reduce(function(prev, next, i) {
  arr[i] = prev.toFixed(2);
  return prev *= 1.059526
}, 5.94);

document.write(arr.join("<br>"));

  </script>

Alexander Belov 13.04.2016 21:08

рони,
Благодарю!
Но появились новые вопросы:
1. Почему при создании мы задаём длину 88+1, а в итоге получаем всё равно 88. Потому что функция возвращает всегда предыдущий элемент массива и чтобы вернуть 88, нужно обработать данные 89 раз?
2. join() и split() методы по умолчанию срабатывают на каждый элемент массива. С join() понятно, но почему если убрать split(), не выводится сплошная строка (не разделённая)? Ничего не выводится в принципе без этого метода.

рони 13.04.2016 21:46

Alexander Belov,
join заполняет промежутки между элементами, промежутков меньше на 1 чем элементов, элементы нам ненужны, их всёравно нет, поэтому увеличиваем число элементов на 1 , превратили массив из 89 несуществующих элементов в строку из 88 настоящих пробелов, с помощью split() разбили строку получили массив длиной 88.
Цитата:

Сообщение от Alexander Belov
не выводится сплошная строка

строка схлопывается она же сплошной пробел без размера.
<script>
var arr = new Array (88+1).join(" ");
document.write("|" + arr + "|<br>"); //строка из 88 обычных пробелов
arr = new Array (88+1).join("\u2007");
document.write("|" + arr + "|");  //строка из 88 пробелов размером с букву
  </script>

Alexander Belov 14.04.2016 00:07

рони,
Благодарю! Понял.


Часовой пояс GMT +3, время: 06:18.