Как разбить число на элементы массива в с++?
Необходимо разбить вводимое число на элементы массива чтобы каждый элемент был разрядом числа.
informatics.mccme.ru/mod/statements/view3.php?id=2.
Это ссылка на задачу, которую мне необходимо решить. Я планирую решить ее следующим образом. Разбить два входных числа на массивы. Потом потом найти все парные элементы и заключить их в массив. отсортировав по убыванию просто вывести массив. Хотел бы получить ответ на поставленный вопрос, либо альтернативный способ решения..^_^
- Вопрос задан более трёх лет назад
- 7682 просмотра
Комментировать
Решения вопроса 1
То, что вы хотите сделать:
#include using namespace std; const int N = (int)1e5+1; string s; int a[N]; int main() < cin >> s; int idx = 0; for (int i = 0; i < s.length(); i++) < a[idx] = s[i] - '0'; idx++; >for (int i = 0; i < idx; i++) < cout return 0; >
Вариант покороче:
#include using namespace std; const int N = (int)1e5+1; string s; int a[N]; int main() < cin >> s; int idx = 0; for (int i = 0; i
Вариант с векторами:
#include using namespace std; const int N = (int)1e5+1; string s; vector a[N]; int main() < cin >> s; for (int i = 0; i
Ответ написан более трёх лет назад
Нравится 1 13 комментариев
Денис Загаевский @zagayevskiy
ну и зачем?
Павел Жиронкин @PaulinhoZh Автор вопроса
Спасибо! Я успел посмотреть решение правда. Но я подобное писал уже на 85 баллов на питоне. Ваше тоже зашло на 85. Но все равно большое спасибо!
Вариант покороче:
.
for (int i = 0; i < s.length(); i++) a[idx++] = s[i] - '0';
Не пиши в одну строку, это вредно для отладки. Там тебе номер строки напишут и скажут, что там ошибка, а ты будешь гадать, а где в этой строке ошибка, ведь там миллион операторов разных. И в результате будешь разбивать её обратно в тот вид, в котором она и должна была быть изначально.
abcd0x00:
Здесь всё предельно просто, и я не считаю необходимым разделять это на несколько строк.
AleexF: а зачем укоротил? Чтобы показаться умнее? Так вот, код укорачивается не за счёт стирания переводов строк, а за счёт применения более оптимального алгоритма. Вот тогда строки и сокращаются.
Ну, и почитай книги какие-нибудь, чтобы видеть эталон.
AleexF:
Вот это тоже хрень полная
const int N = (int)1e5+1;
Во-первых в C++ не принято юзать такое приведение (оно для совместимости с сишными программами оставлено), а во-вторых, оно там не нужно, потому что и так выполняется.
abcd0x00: Это default code называется. Почитай про олимпиадное программирование, может поймёшь
abcd0x00: Я занимаюсь спортивным программированием и считаю твои советы не уместными. Ах да, кстати, я имел ввиду визуально сократил, но ты видимо читаешь код на ассемблере..
Это default code называется. Почитай про олимпиадное программирование, может поймёшь
Это не default code, это ты не знаешь язык.
Вот так это записывается
const int N = 1e5+1;
а приведение выполняется автоматом (неявное приведение типа это называется).
Я занимаюсь спортивным программированием и считаю твои советы не уместными.
Начинай заниматься уже чем-нибудь серьёзным. А в серьёзном очень важна читаемость кода, потому что разработка происходит обычно десятками разных человек, незнакомых друг с другом. Если ты включишься в серьёзную разработку, ты поймёшь, о чём я говорю, когда начнёшь разбираться в чужом коде (кода на мегабайт, а разбираться нужно быстро через отладчик, и тут какой-то дуралей всё в одну строку записал; ты в итоге будешь тратить время на обратное раскладывание за ним, либо не будешь понимать программу).
AleexF: кстати, в любом случае может возникнуть переполнение что с приведением, что без, потому что int нужно предполагать равным short int, а тот на текущих системах больше 32767 вмещать не может, так что твои 100001 его просто переполнят на каком-нибудь компиляторе, где int не равен long int, и там будет случайное число.
abcd0x00: Я не разрабатываю софт. Я решаю поставленные задачи.
AleexF: а зачем тогда делаешь варианты покороче, если варианты подлиннее уже решают поставленные задачи? Запутался?
Мне так больше нравиться. Чтобы у тебя не было 100500 строк кода, где ты делаешь простейшие вычисления
Ответы на вопрос 3
Максим @khrisanfov
Программист
Во-первых в C++ нет возможности работать с разрядами, минимальный размер это char. Во-вторых ввод пользователя поступает в виде строки (массив char), числа тут вообще не причем (символы можно сортировать также как и числа).
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Денис Загаевский @zagayevskiy
Android developer at Yandex
Тебе не надо читать числа, тем более, 100000 знаков - это длинная арифметика. Надо просто посимвольно читать ввод. Задача простая.
Ответ написан более трёх лет назад
Павел Жиронкин @PaulinhoZh Автор вопроса
Я, наверное, не понимаю, но ввод производится одним числом. Я и хочу его разбить на цифры..
Денис Загаевский @zagayevskiy
Павел Жиронкин: Ты не понимаешь. Не надо рассматривать это "в тупую", как написано в условии. Никакого отношения к решению то, что это числа не имеет. Рассматривай это просто как набор символов.
Павел Жиронкин @PaulinhoZh Автор вопроса
Денис Загаевский: Я пишу на С++ две недели.. Много не знаю, много не понимаю.. Я не знаю, как посимвольно читать ввод. Напишите сюда пожалуйста, как это сделать)
Денис Загаевский @zagayevskiy
Павел Жиронкин: stackoverflow.com/questions/12240010/how-to-read-f. читайте, юноша.

Для правильного вопроса надо знать половину ответа
Учитывая, что в условии допускается 100000-значное число, то работать с ним как с числом в С++ так просто не получится. Задача решается с помощью подсчёта цифр как символов вводимых строк. Для каждой из двух входных строк надо посчитать количество каждых цифр. Получится два массива по 10 элементов. Затем, начиная с 9 надо вывести цифры в количестве, равном минимальному из двух значений соответствующих ячеек массива.
Например:
280138 798081 Первый массив: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | Второй массив: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 1 | Минимумы: | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +---+---+---+---+---+---+---+---+---+---+ | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Результат: 8810
Преобразовать целое число в массив
Это домашнее задание, но я укушу. Моя жена действительно не понимала этого, пока я не объяснил ей это.
Broam 07 дек. 2009, в 16:15
Что-то идет не так в вашем ". ". В массиве 7 членов, но только 6 десятичных цифр в числе.
Steve Jessop 07 дек. 2009, в 16:30
Показать ещё 1 комментарий
Поделиться:
11 ответов
Возможно, лучшим решением будет обратная работа:
123456 / 10 = 12345
12345 / 10 = 1234
Broam 07 дек. 2009, в 18:05
Поделиться
просто используйте модульную арифметику:
int array[6]; int number = 123456; for (int i = 5; i >= 0; i--) < array[i] = number % 10; number /= 10; >
user224003 07 дек. 2009, в 16:55
Поделиться
как насчет ответа, который на самом деле объясняет подход, чтобы ОП узнал что-то?
jalf 07 дек. 2009, в 16:21
Также это жестко закодировано, чтобы иметь дело с 6-значными числами
philsquared 07 дек. 2009, в 16:22
Это будет правильно работать только с 6-значными неотрицательными целыми числами.
Drew Dormann 07 дек. 2009, в 16:22
Я хотел, чтобы ОП подумал о том, как расширить его для обработки других чисел, не приводя только общий случай.
user224003 07 дек. 2009, в 16:24
Показать ещё 2 комментария
Вы можете извлечь последнюю цифру номера следующим образом:
int digit = number % 10; number /= 10;
Обратите внимание, что вы также должны проверить, является ли number положительным. Другие значения требуют дополнительной обработки.
avakar 07 дек. 2009, в 16:36
Поделиться
Здесь, что я придумал, функция integerToArray возвращает вектор, который преобразуется из целочисленного значения. вы также можете проверить его с помощью основной функции:
#include #include using namespace std; vector integerToArray(int x) < vector resultArray; while (true) < resultArray.insert(resultArray.begin(), x%10); x /= 10; if(x == 0) return resultArray; >> int main() < vector temp = integerToArray(1234567); for (auto const &element : temp) cout //outputs 1 2 3 4 5 6 7
Orhun Yeldan 09 авг. 2017, в 13:27
Поделиться
Возьмите log10 номера, чтобы получить количество цифр. Поместите это, скажем pos , затем, в цикле, возьмите по модулю 10 ( n % 10 ), поместите результат в массив в позиции pos . Decrement pos и разделите число на 10. Повторяйте до pos == 0
Что вы хотели сделать со знаком, если он отрицательный?
philsquared 07 дек. 2009, в 18:07
Поделиться
Если вы хотите превратить его в строку, это будет очень просто, просто сделайте то, что говорят все остальные, используя оператор%:
Скажем num = 123, мы можем это сделать:
string str; while (num > 0) < str = (num % 10) + str; //put last digit and put it into the beginning of the string num = num /10; //strip out the last digit >
Теперь вы можете использовать str как массив символов. Выполнение этого с помощью массива - это проблема, потому что для ввода вещей в начале массива требуется переместить все остальное. Мы можем сделать это, вместо того чтобы помещать каждую цифру в строку, мы можем поместить ее в стек. Он поставит его в обратном порядке следующим образом: 3 2 1. Затем мы можем вытащить верхний номер один за другим и поместить его в массив в правильном порядке. Ваш массив будет выглядеть так: 1 2 3. Я оставлю реализацию вам, поскольку это домашняя работа.
@Broam имеет хорошее решение, но, как он заявил, он работает в обратном направлении. Я думаю, что ОП или тот, кто придет в этот поток, захочет его вперед и почему я публикую это. Если у вас есть лучшее решение, ответьте, я также заинтересован.
Массивы
Часто возникает необходимость хранить не одну переменную, а набор однотипных переменных. Например, список учащихся класса – это набор данных строкового типа, координаты вершин многоугольника или коэффициенты многочлена – это набор числовых данных. Для хранения наборов данных используются структуры данных. Основная структура данных – это массив.
— это структура однотипных данных, занимающих непрерывную область памяти. Массив имеет размер — количество элементов в нем. Каждый элемент массива имеет свой номер (также называемый ), обращение к элементу массива осуществляется путем указания его индекса. В языке C++ элементы нумеруются начиная с 0, поэтому последний элемент массива имеет номер на 1 меньше размера массива.
Массив в языке C++ задается следующим образом:
тип_элементов идентификатор[размер];
где тип_элементов — произвольный тип данных языка C++, который будут иметь элементы массива, например, int , double и т.д.; идентификатор — имя массива, размер — число элементов в нем.
По стандарту языков C и C++, размер массива должен быть константой, определенной на момент компиляции программы, то есть можно определить массив в виде int A[10 + 5] , но нельзя это сделать в виде int A[n] . Однако, компилятор gcc, которым мы пользуемся, допускает объявления второго вида, но при этом нет никаких гарантий, что ваша программа будет откомпилирована каким-либо другим компилятором.
К элементу массива можно обращаться, как идентификатор [ индекс ] . Например, если было сделано объявление
double A[5];
то таким образом создается 5 элементов массива типа double : A[0] , A[1] , A[2] , A[3] , A[4] .
Пример программы, которая создает массив типа int[] , заданного пользователем размера, считывает с клавиатуры его элементы, затем прибавляет к каждому элементу массива число 1 , затем выводит результат на экран:
#include using namespace std; int main() < int n; // Размер массива int i; // Счетчик в циклах cin >> n; // Считываем размер массива int A[n]; // Объявление массива // Считываем массив for (i = 0; i < n; ++i) < cin >> A[i]; > // Прибавляем по 1 к каждому элементу for (i = 0; i < n; ++i) < A[i] += 1; >// Выводим массив на экран for (i = 0; i < n; ++i) < cout // Переведем курсор на новую строку cout
В этом примере при помощи // обозначается начало комментария, весь текст после начала комментария и до конца строки компилятором игнорируется. Второй способ объявления комментария: в начале комментария поставить знаки /* , а в конце – */ . Это позволяет делать комментарии, занимающие несколько строк. В языке C допустимы только такие комментарии.
Передача массива в качестве параметра
Массивы можно передавать функции в качестве параметра. Но при этом размер создаваемого массива может быть неопределен на момент компиляции программы, поэтому функция не может знать размер полученного массива. Поэтому в функции нужно передавать два параметра - указатель на начала массива (например, для массива целых чисел это int * , и количество элементов в массиве.
Например, функция поиска наименьшего значения в массиве int A[n] может быть объявлена так:
int Min (int * A, int n) < int result; // Вычисляем ответ return result; >
Соответственно, внутри функции main мы объявляем массив int A[n] и вызываем функцию Min , передав в качестве параметров массив A и его размер n :
int main() < int n, i; cin >> n; int A[n]; for (i = 0; i < n; ++i) < cin >> A[i]; > cout
Упражнения
3A: Вывести в обратном порядке
Выведите элементы данного массива в обратном порядке, не изменяя сам массив.
5
1 2 3 4 5
5 4 3 2 1
3B: Переставить min и max
В массиве все элементы различны. Поменяйте местами минимальный и максимальный элемент этого массива.
5
3 4 5 2 1
3 4 1 2 5
3С: Шеренга
Петя перешёл в другую школу. На уроке физкультуры ему понадобилось определить своё место в строю. Помогите ему это сделать.
Программа получает на вход число N – количество человек в классе. Затем невозрастающая последовательность из N чисел, означающих рост каждого человека в строю. После этого вводится число X – рост Пети. Все числа во входных данных натуральные и не превышают 200.
Выведите номер, под которым Петя должен встать в строй. Если в строю есть люди с одинаковым ростом, таким же, как у Пети, то он должен встать после них.
Примечание. Это тоже линейный поиск, поэтому необходимо использовать цикл while .
8
165 163 160 160 157 157 155 154
162
8
165 163 160 160 157 157 155 154
160
3D: k-е вхождение
Дан массив чисел, число \(a\) и натуральное число \(k\) . Выведите индекс \(k\)-го по счету появления в массиве числа \(a\). Если число \(a\) встречается в массиве менее \(k\) раз, выведите число -1.
Решение оформите в виде функции int KthAppearance(int * A, int n, int a, int k) . Задача должна решаться за однократный проход по массиву
10
1 2 1 3 2 3 2 3 2 2
3 2
4
1 1 1 1
1 5
3E: Противоположные элементы в массиве
Дан массив. Определите, есть ли в нем два противоположных (то есть дающих в сумме 0) числа.
Если такие числа есть в массиве, выведите их индексы в порядке возрастания. Если таких чисел в массиве нет, выведите одно число 0.
5
1 2 3 -2 -4
3F: Сортировка
Дан массив целых чисел. Отсортируйте его в порядке неубывания значений. Выведите полученный массив на экран.
Вспомогательным массивом пользоваться нельзя.
5
1 4 2 3 4
1 2 3 4 4
4A: Количество различных элементов - 2
Дан массив. Посчитайте, сколько в нем различных элементов, не изменяя самого массива.
Указание. Будем считать те элементы, которые встретились нам впервые. Чтобы проверить, встретился ли нам элемент A[i] впервые, необходимо проверить, встречается ли значение A[i] среди элементов с индексами, меньшими i . А это — линейный поиск, он пишется при помощи цикла while .
5
3 2 1 2 3
4B: Уникальные элементы
Дан массив. Выведите те его элементы, которые встречаются в массиве только один раз. Элементы нужно выводить в том порядке, в котором они встречаются в массиве.
Указание. Элемент является уникальным, если он больше нигде не встречается в массиве. Это тоже — линейный поиск.
6
1 2 2 3 3 3
4C: Самое частое число
Дан массив. Не изменяя массива и не заводя дополнительного массива определите, какое число в этом массиве встречается чаще всего.
Если таких чисел несколько, выведите любое из них.
6
1 2 3 2 3 3
4D: Личные дела
Однажды неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям.
В первой строке входных данных записано число \(N\) (\(1 \le N \le 1000\)) — количество личных дел. Далее записано \(N\) строк, каждая из которых состоит из фамилии учащегося (строка без пробелов) и номера класса (целое число от 1 до 11).
Нужно вывести список всех учащихся, сначала выводя номер класса, затем — фамилию учащегося. Список должен быть отсортирован по классу, а затем по фамилии.
3
Ivanov 10
Petrov 9
Sidorov 9
9 Petrov
9 Sidorov
10 Ivanov
4E: Такси
После затянувшегося совещания директор фирмы решил заказать такси, чтобы развезти сотрудников по домам. Он заказал \(N\) машин —ровно столько, сколь у него сотрудников. Однако когда они подъехали, оказалось, что у каждого водителя такси свой тариф за 1 километр.
Директор знает, какому сотруднику сколько километров от работы до дома (к сожалению, все сотрудники живут в разных направлениях, поэтому нельзя отправить двух сотрудников на одной машине). Теперь директор хочет определить, сколько придется заплатить за перевозку всех сотрудников. Естественно, директор хочет заплатить как можно меньшую сумму.
В первой строке записано число сотрудников \(N\), во второй строке записаны \(N\) чисел через пробел, задающих расстояния в километрах от работы до домов сотрудников компании. В третьей строке записаны \(N\) чисел — тарифы за проезд одного километра в такси.
Выведите одно целое число — наименьшую сумму, которую придется заплатить за доставку всех сотрудников.
3
10 20 30
50 20 30
1700
4F: Коньки
В 179 школе есть много коньков самых разных размеров. Школьник может надеть коньки любого размера, который не меньше размеров его ноги. Известны размеры всех коньков и размеры ног школьников. Определите, какое наибольшее число школьников сможет одновременно пойти покататься.
Первая строка входных данных содержит количество коньков \(N\). Во второй строке записаны \(N\) чисел — размеры коньков. В третьей строке записано количество школьнико \(M\). В четвертой строке записаны \(M\) чисел — размеры ног школьников.
Выведите единственное число — наибольшее количество школьников, которое сможет пойти на каток.
4
41 40 39 42
3
42 41 42
4G: Скидки
В супермаркете проводится беспрецедентная акция: “Покупая два любых товара, третий получаешь бесплатно*”, а внизу мелким шрифтом приписано “* — из трех выбранных вами товаров оплачиваются два наиболее дорогих” .
Вася, идя в супермаркет, определился, какие товары он хочет купить, и узнал, сколько они стоят. Помогите ему определить минимальную сумму денег, которую ему нужно взять с собой, чтобы в итоге стать счастливым обладателем этих товаров.
Программа получает на вход число \(N\) (\(1\le N\le 1000\)), а затем \(N\) чисел — стоимости выбранных Васей товаров. Все стоимости — натуральные числа, не превышающие 10000.
Выведите одно число — сумму денег, которую Вася должен взять с собой в супермаркет (минимально возможную).
6
1 5 4 3 5 7
5
3 15 25 8 8
5A: Наибольшее произведение двух чисел
Дан массив, заполненный целыми числами, не превосходящими по модулю \(10^6\). Найдите в этом списке два числа, произведение которых максимально. Выведите эти числа.
Количество чисел в массиве не превосходит 100000. Решение должно иметь сложность \(O(n)\). Стандартной сортировкой пользоваться нельзя.
5
4 3 5 2 5
5
-4 3 -5 2 5
5B: Слияние массивов
Даны два массива int A[n] и int B[m] упорядоченных по неубыванию. Объедините их в один упорядоченный массив int C[n+m] . Решение оформите в виде функции void merge (int * A, int n, int * B, int m, int * C) . Алгоритм должен иметь сложность \(O(n+m)\).
Программа получает на вход число \(n\), затем последовательность из \(n\) неубывающих чисел — элементы первого массива, затем число \(m\), затем последовательность из \(m\) неубывающих чисел — элементы второго массива.
Программа должна вывести \(n+m\) чисел, полученных объединением двух массивов в порядке неубывания.
3
1 5 7
4
2 4 4 5
1 2 4 4 5 5 7
5C: Задача Иосифа Флавия
\(N\) человек, пронумерованных числами от 1 до \(N\) стоят в кругу. Они начинают считаться, каждый \(K\)-й по счету человек выбывает из круга, после чего счет продолжается со следующего за ним человека.
Определите номер человека, который останется в кругу последним.
Программа получает на вход числа \(N\) и \(K\), не превосходящие 100 и должна вывести одно число от 1 до \(N\).
В этом примере люди выбывают в таком порядке: 2, 5, 1, 3, остался номер 4.
5D: Большой сдвиг
Программа получает на вход массив из \(N\) элементов, затем число \(K\).
Решение должно иметь сложность \(O(N)\), то есть не должно зависеть от \(K\). Дополнительным массивом пользоваться нельзя.
5
5 3 7 4 6
3
7 4 6 5 3
5E: Наибольшее произведение трех чисел
В данном списке из \(N\) целых чисел (\(N\le10^6\)), не превосходящих по модулю\(10^6\) найдите три числа, произведение которых максимально.
Решение должно иметь сложность \(O(N)\).
Выведите три искомых числа в любом порядке.
Тесты к этой задаче закрытые.
9
3 5 1 7 9 0 9 -3 10
Array.from()
Метод Array.from() создаёт новый экземпляр Array из массивоподобного или итерируемого объекта.
Интерактивный пример
Синтаксис
Array.from(arrayLike[, mapFn[, thisArg]])
Параметры
Массивоподобный или итерируемый объект, преобразуемый в массив.
Отображающая функция, вызываемая для каждого элемента массива.
Значение, используемое в качестве this при выполнении функции mapFn .
Возвращаемое значение
Описание
Array.from() позволяет вам создавать массивы из:
- массивоподобных объектов (объектов со свойством length и элементами по индексным ключам) или
- итерируемых объектов (объектов, из которых вы можете достать их элементы, например Map (en-US) или Set ).
Array.from() имеет необязательный параметр mapFn , который позволяет вам выполнять функцию map для каждого элемента создаваемого массива (или его подкласса). Проще говоря, вызов Array.from(obj, mapFn, thisArg) эквивалентен цепочке Array.from(obj).map(mapFn, thisArg) , за исключением того, что он не создаёт промежуточного массива. Это особенно важно для некоторых подклассов массива, вроде типизированных массивов, поскольку промежуточный массив неизбежно приведёт к усечению значений, чтобы они подпали под подходящий тип.
Свойство length метода from() равно 1.
В ES2015 классовый синтаксис позволяет создавать подклассы как встроенных классов, так и классов, определённых пользователем; в результате статические методы класса, вроде Array.from «наследуются» подклассами Array и создают новые экземпляры подкласса, а не класса Array .
Примеры
Массив из строки String
.from("foo"); // ['f', 'o', 'o']
Массив из Set
var s = new Set(["foo", window]); Array.from(s); // ['foo', window]
Массив из Map
var m = new Map([ [1, 2], [2, 4], [4, 8], ]); Array.from(m); // [[1, 2], [2, 4], [4, 8]]
Массив из массивоподобного объекта (arguments)
function f() return Array.from(arguments); > f(1, 2, 3); // [1, 2, 3]
Использование стрелочной функции и Array.from()
// Использование стрелочной функции в качестве функции отображения для // манипулирования элементами Array.from([1, 2, 3], (x) => x + x); // [2, 4, 6] // Генерирования последовательности чисел Array.from( length: 5 >, (v, k) => k); // [0, 1, 2, 3, 4]
Полифил
Метод Array.from был добавлен к стандарту ECMA-262 в 6-м издании; поэтому он может отсутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать Array.from в реализациях, которые не поддерживают этот метод. Этот алгоритм является точно тем, что описан в ECMA-262 6-го издания; он предполагает, что Object и TypeError имеют свои первоначальные значения и что callback.call вычисляется в оригинальное значение Function.prototype.call . Кроме того, поскольку истинные итерируемые объекты не могут быть заменены полифилом, эта реализация не поддерживает общие итерируемые объекты, как они определены в 6-м издании ECMA-262.
// Шаги алгоритма ECMA-262, 6-е издание, 22.1.2.1 // Ссылка: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from if (!Array.from) Array.from = (function () var toStr = Object.prototype.toString; var isCallable = function (fn) return typeof fn === "function" || toStr.call(fn) === "[object Function]"; >; var toInteger = function (value) var number = Number(value); if (isNaN(number)) return 0; > if (number === 0 || !isFinite(number)) return number; > return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); >; var maxSafeInteger = Math.pow(2, 53) - 1; var toLength = function (value) var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); >; // Свойство length метода from равно 1. return function from(arrayLike /*, mapFn, thisArg */) // 1. Положим C равным значению this. var C = this; // 2. Положим items равным ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) throw new TypeError( "Array.from requires an array-like object - not null or undefined", ); > // 4. Если mapfn равен undefined, положим mapping равным false. var mapFn = arguments.length > 1 ? arguments[1] : void undefined; var T; if (typeof mapFn !== "undefined") // 5. иначе // 5. a. Если вызов IsCallable(mapfn) равен false, выкидываем исключение TypeError. if (!isCallable(mapFn)) throw new TypeError( "Array.from: when provided, the second argument must be a function", ); > // 5. b. Если thisArg присутствует, положим T равным thisArg; иначе положим T равным undefined. if (arguments.length > 2) T = arguments[2]; > > // 10. Положим lenValue равным Get(items, "length"). // 11. Положим len равным ToLength(lenValue). var len = toLength(items.length); // 13. Если IsConstructor(C) равен true, то // 13. a. Положим A равным результату вызова внутреннего метода [[Construct]] // объекта C со списком аргументов, содержащим единственный элемент len. // 14. a. Иначе, положим A равным ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Положим k равным 0. var k = 0; // 17. Пока k < len, будем повторять. (шаги с a по h)var kValue; while (k len) kValue = items[k]; if (mapFn) A[k] = typeof T === "undefined" ? mapFn(kValue, k) : mapFn.call(T, kValue, k); > else A[k] = kValue; > k += 1; > // 18. Положим putStatus равным Put(A, "length", len, true). A.length = len; // 20. Вернём A. return A; >; >)(); >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.from |
Совместимость с браузерами
BCD tables only load in the browser