Как из массива сделать объект javascript
Перейти к содержимому

Как из массива сделать объект javascript

  • автор:

JS записать массив в объект

пол дня пытаюсь записать массив в объект, но корректно не получается. Дано:

const numbers = [1, 2, 3, 4, 5, 6]; 

Требуется отделить четные от нечетных и вернуть объект вида:

Что удалось сделать:

function separateArray(array) < var e = array.filter(i =>i % 2 == 0); // получил массив с четными var o = array.filter(i => i % 2 !== 0); // получил массив с нечетными var oString = o.join(', '); //сделал строку из массива с нечетенми для примера var goal = new Object(); // сделал целевой объект goal.even = e; // значение ключа массив --- не отображается goal.odd = oString; // значение ключа строка --- отображается, но без квадраных скобок console.log(goal); alert(goal); > 

Как из массива сделать объект javascript

У вас есть массив объектов user , и у каждого из объектов есть name , surname и id .

Напишите код, который создаст ещё один массив объектов с параметрами id и fullName , где fullName – состоит из name и surname .

let vasya = < name: "Вася", surname: "Пупкин", id: 1 >; let petya = < name: "Петя", surname: "Иванов", id: 2 >; let masha = < name: "Маша", surname: "Петрова", id: 3 >; let users = [ vasya, petya, masha ]; let usersMapped = /* . ваш код . */ /* usersMapped = [ < fullName: "Вася Пупкин", id: 1 >, < fullName: "Петя Иванов", id: 2 >, < fullName: "Маша Петрова", id: 3 >] */ alert( usersMapped[0].id ) // 1 alert( usersMapped[0].fullName ) // Вася Пупкин

Итак, на самом деле вам нужно трансформировать один массив объектов в другой. Попробуйте использовать => . Это небольшая уловка.

let vasya = < name: "Вася", surname: "Пупкин", id: 1 >; let petya = < name: "Петя", surname: "Иванов", id: 2 >; let masha = < name: "Маша", surname: "Петрова", id: 3 >; let users = [ vasya, petya, masha ]; let usersMapped = users.map(user => ( < fullName: `$$`, id: user.id >)); /* usersMapped = [ < fullName: "Вася Пупкин", id: 1 >, < fullName: "Петя Иванов", id: 2 >, < fullName: "Маша Петрова", id: 3 >] */ alert( usersMapped[0].id ); // 1 alert( usersMapped[0].fullName ); // Вася Пупкин

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

Мы не можем написать вот так:

let usersMapped = users.map(user => < fullName: `$$`, id: user.id >);

Как мы помним, есть две функции со стрелками: без тела value => expr и с телом value => <. >.

let usersMapped = users.map(user => ( < fullName: `$$`, id: user.id >));

Массивы

Для хранения набора данных в языке JavaScript предназначены массивы. Массивы в JavaScript представлены объектом Array . Объект Array предоставляет ряд свойств и методов, с помощью которых мы можем управлять массивом и его элементами.

Создание массива

Можно создать пустой массив, используя квадратные скобки или конструктор Array:

const users = new Array(); const people = []; console.log(users); // Array[0] console.log(people); // Array[0]

Можно сразу же инициализировать массив некоторым количеством элементов:

const users = new Array("Tom", "Bill", "Alice"); const people = ["Sam", "John", "Kate"]; console.log(users); // ["Tom", "Bill", "Alice"] console.log(people); // ["Sam", "John", "Kate"]

Можно определить массив и по ходу определять в него новые элементы:

const users = []; users[1] = "Tom"; users[2] = "Kate"; console.log(users[1]); // "Tom" console.log(users[0]); // undefined

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

Еще один способ инициализации массивов представляет метод Array.of() — он принимает элементы и инициизирует ими массив:

const people = Array.of("Tom", "Bob", "Sam"); console.log(people); // ["Tom", "Bob", "Sam"]

Array.from

И еще один способ представляет функция Array.from() . Она имеет много вариантов, рассмотрим самые распространенные:

Array.from(arrayLike) Array.from(arrayLike, function mapFn(element) < . >) Array.from(arrayLike, function mapFn(element, index) < . >)

В качестве первого параметра — arrayLike функция принимает некий объект, который, условно говоря, «похож на массив», то есть может быть представлен в виде набора элементов. Это может быть и другой массив, это может быть и строка, которая по сути предоставляет набор символов. Вообщем какой-то набор элементов, который можно преобразовать в массив. Кроме того, это может и некий объект, в котором определено свойство length . Например:

const array = Array.from("Hello"); console.log(array); // ["H", "e", "l", "l", "o"]

В данном случае в функцию передается строка и возвращается массив, каждый элемент которого предоставляет один из символов этой строки.

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

const numbers = [1, 2, 3, 4]; const array = Array.from(numbers, n => n * n); console.log(array); // [1, 4, 9, 16]

В данном случае в функцию Array.from() передается массив чисел. Второй параметр — функция (в данном случае в ее роли выступает лямбда-выражение) запускается для каждого числа из этого массива и получает это число через параметр n . В самом лямбда-выражении возвращаем квадрат этого числа. В итоге Array.from() возвратит новый массив, в котором будут квадраты чисел из массива numbers.

И еще одна версия функции Array.from() в качестве второго параметра принимает функцию преобразования, в которую кроме элемента из перебираемого набора передается и индекс этого элемента:

Array.from(arrayLike, function mapFn(element, index) < . >)

Используем эту версию и передадим в функцию объект со свойством length :

const array = Array.from(, (element, index) => < console.log(element); // undefined return index; >); console.log(array); // [0, 1, 2]

Здесь в функцию передается объект, у которого свойство length равно 3. Для функции Array.from это будет сигналом, в возвращаемом массиве должно быть три элемента. При этом неважно, что функция преобразования из второго параметра принимает элемент набора (параметр element ) — в данном случае он будет всегда undefined , тем не менее значение length:3 будет указателем, что возвращаемый массив будет иметь три элемента с соответственно индексами от 0 до 2. И через второй параметр функции преобразования — параметр index мы можем и получить текущий индекс элемента.

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

const array = Array.from(, (element) => < console.log(element); return element; >); console.log(array); // ["Tom", "Sam", "Bob"]

length

Чтобы узнать длину массива, используется свойство length :

const fruit = []; fruit[0] = "яблоки"; fruit[1] = "груши"; fruit[2] = "сливы"; console.log("В массиве fruit ", fruit.length, " элемента"); for(let i=0; i < fruit.length; i++) console.log(fruit[i]);

По факту длиной массива будет индекс последнего элемента с добавлением единицы. Например:

const users = []; // в массиве 0 элементов users[0] = "Tom"; users[1] = "Kate"; users[4] = "Sam"; for(let i=0; i
Tom Kate undefined undefined Sam

Несмотря на то, что для индексов 2 и 3 мы не добавляли элементов, но длиной массива в данном случае будет число 5. Просто элементы с индексами 2 и 3 будут иметь значение undefined .

Array.from()

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015 .

Метод 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *