Как вернуть пустой массив js
Перейти к содержимому

Как вернуть пустой массив js

  • автор:

Array.prototype.splice()

Метод splice() изменяет содержимое массива, удаляя существующие элементы и/или добавляя новые.

Синтаксис

array.splice(start[, deleteCount[, item1[, item2[, . ]]]])

Параметры

Индекс, по которому начинает изменять массив. Если больше длины массива, реальный индекс будет установлен на длину массива. Если отрицателен, указывает индекс элемента с конца.

Целое число, показывающее количество старых удаляемых из массива элементов. Если deleteCount равен 0, элементы не удаляются. В этом случае вы должны указать как минимум один новый элемент. Если deleteCount больше количества элементов, оставшихся в массиве, начиная с индекса start , то будут удалены все элементы до конца массива.

Необязательные параметры. Добавляемые к массиву элементы. Если вы не укажете никакого элемента, splice() просто удалит элементы из массива.

Возвращаемое значение

Массив, содержащий удалённые элементы. Если будет удалён только один элемент, вернётся массив из одного элемента. Если никакие элементы не будут удалены, вернётся пустой массив.

Описание

Если количество указанных вставляемых элементов будет отличным от количества удаляемых элементов, массив изменит длину после вызова.

Примеры

Удаляет 0 элементов по индексу 2 и вставляет «drum»

var myFish = ["angel", "clown", "mandarin", "sturgeon"]; var removed = myFish.splice(2, 0, "drum"); // myFish равен ["angel", "clown", "drum", "mandarin", "sturgeon"] // removed равен [], ничего не удалено 

Удаляет 1 элемент по индексу 3

var myFish = ["angel", "clown", "drum", "mandarin", "sturgeon"]; var removed = myFish.splice(3, 1); // removed равен ["mandarin"] // myFish равен ["angel", "clown", "drum", "sturgeon"] 

Удаляет 1 элемент по индексу 2 и вставляет «trumpet»

var myFish = ["angel", "clown", "drum", "sturgeon"]; var removed = myFish.splice(2, 1, "trumpet"); // myFish равен ["angel", "clown", "trumpet", "sturgeon"] // removed равен ["drum"] 

Удаляет 2 элемента начиная с индекса 0 и вставляет «parrot», «anemone» и «blue»

var myFish = ["angel", "clown", "trumpet", "sturgeon"]; var removed = myFish.splice(0, 2, "parrot", "anemone", "blue"); // myFish равен ["parrot", "anemone", "blue", "trumpet", "sturgeon"] // removed равен ["angel", "clown"] 

Удаляет 2 элемента начиная с индекса 2

var myFish = ["parrot", "anemone", "blue", "trumpet", "sturgeon"]; var removed = myFish.splice(myFish.length - 3, 2); // myFish равен ["parrot", "anemone", "sturgeon"] // removed равен ["blue", "trumpet"] 

Удаляет 1 элемент по индексу -2

var myFish = ["angel", "clown", "mandarin", "sturgeon"]; var removed = myFish.splice(-2, 1); // myFish равен ["angel", "clown", "sturgeon"] // removed равен s ["mandarin"] 

Удаляет все элементы после индекса 2 (включительно)

var myFish = ["angel", "clown", "mandarin", "sturgeon"]; var removed = myFish.splice(2); // myFish равен ["angel", "clown"] // removed равен ["mandarin", "sturgeon"] 

Спецификации

Specification
ECMAScript Language Specification
# sec-array.prototype.splice

Совместимость с браузерами

BCD tables only load in the browser

Обратная совместимость

В JavaScript 1.2 метод splice() возвращал удалённый элемент только если был удалён один элемент (параметр deleteCount равен 1); в противном случае метод возвращал массив с удалёнными элементами. Обратите внимание, что последним браузером, использующим JavaScript 1.2, был Netscape Navigator 4, так что вы можете считать, что splice() всегда возвращает массив.

Смотрите также

  • push() / pop() — добавление / удаление элементов с конца массива
  • unshift() / shift() — добавление / удаление элементов с начала массива
  • concat() — возвращает новый массив, состоящий из данного массива, соединённого с другими массивами и/или значениями

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 20 янв. 2024 г. by MDN contributors.

Your blueprint for a better internet.

как ничего не вернуть (пустой массив) с функцией array.map

просто напишите return; Также рассмотрите возможность использования Array.prototype.filter для этого.

theWanderer4865 27 июнь 2016, в 19:29
если я делаю это, он возвращает ‘NULL’, который я не хочу
Angular 27 июнь 2016, в 19:29

Вы, вероятно, хотите использовать метод, такой как filter . map возвращает элемент для каждого элемента, который вы повторяете.

dyagmin 27 июнь 2016, в 19:30
@Angular Изменить map на filter , return » в false и return x.name в true
Bálint 27 июнь 2016, в 19:32
Или вы можете просто поставить return x.name === ‘Everything’ вместо целого, если . еще
Bálint 27 июнь 2016, в 19:32

Карта всегда будет возвращать что-то, вам нужно будет изменить его на фильтр или, используя регулярный цикл for, чтобы получить желаемое поведение.

theWanderer4865 27 июнь 2016, в 19:34

ребята, мой бэкэнд ожидает пустой список [], если выбрано «все». В противном случае он ожидает список других имен [«яблоко», «апельсин»]. Каков наилучший способ?

Angular 27 июнь 2016, в 19:34
Возможное дублирование удаления элементов с помощью Array.map в JavaScript
GingerPlusPlus 27 июнь 2016, в 19:59
Показать ещё 6 комментариев
Поделиться:

3 ответа

Лучший ответ

Copy.names = rule.names.filter(function(x) < return x.name !=='Everything'; >).map(function (x) < return x.name; >); 

Dylon 27 июнь 2016, в 21:21
Поделиться
Я сделал это, он на самом деле возвращает «Все», что неправильно
Angular 27 июнь 2016, в 19:38

Если вы используете код в исходном сообщении, проблема заключается в том, что Array.prototype.map применяет преобразование к каждому элементу в вашем списке. Вместо этого вы должны использовать некоторую логику для удаления или игнорирования элементов, которые вам не нужны. Array.prototype.map не имеет возможности игнорировать только элементы, поэтому его необходимо объединить с другой функцией, например Array.prototype.filter: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Dylon 27 июнь 2016, в 19:41
x.name !== ‘Everything’ это не должно быть x.name !== ‘Everything’ ?
GingerPlusPlus 27 июнь 2016, в 19:45
Да лол. Это сейчас исправлено.
Dylon 27 июнь 2016, в 19:46
Показать ещё 2 комментария

Если вы можете использовать ES6, вы можете использовать генератор для этого:

Copy.names = Array.from(function* () < for (var x of rule.names) < if (x.name ==='Everything') < // do nothing >else < yield x.name; >> >) 

Если нет. вы всегда можете пойти на императивный путь:

Copy.names = [] for (var x of rule.names) < if (x.name ==='Everything') < // do nothing >else < Copy.names.push(x.name); >> 

GingerPlusPlus 27 июнь 2016, в 20:29
Поделиться

Я не думаю, что первый подход (использование Array.from с генератором) работает. Я пробовал это в разных средах с поддержкой ES6, и он всегда возвращает пустой массив.

Chris 30 авг. 2017, в 06:45

Если вы можете использовать Lodash (что я настоятельно рекомендую), вы можете с этим справиться с помощью _.flatMap :

Copy.names = _.flatMap(rule.names, function(x) < if (x.name ==='Everything') < return []; >else < return [x.name]; >>) 

Как вы можете видеть, он похож на map , за исключением того, что вы возвращаете массив элементов вместо элемента.

GingerPlusPlus 27 июнь 2016, в 20:24
Поделиться

Одним из предостережений этого подхода является то, что вы создадите временный массив для каждого элемента в файле rule.names. Это не имеет большого значения для нескольких элементов, но может стать дорогостоящим с большими списками.

Dylon 27 июнь 2016, в 19:37

Ещё вопросы

  • 1 Java, проверочный URL-адрес ResponseCode
  • 1 Затмение Android Плагин вяло
  • 0 Селектор атрибутов jQuery в IE
  • 0 Попытка сделать добавление текста буква за буквой
  • 0 Как рассчитать итоговую сумму в MySQL без группы по предложению в MySQL
  • 0 json из js в php — не удалось открыть поток: сбой http-запроса
  • 0 AngularJS Случайно находит модуль, Случайно нет, Случайно выдает ошибку
  • 0 Проверить ключ массива PHP> Значение
  • 1 Удаление строки запроса из ServletRequest после того, как она достигает сервлета / фильтра
  • 0 Вставьте верхние / нижние колонтитулы страницы при печати документа HTML
  • 1 Парсер DOM для чтения Xml, извлечения значений атрибутов и их хранения
  • 0 Как я могу сгруппировать вывод из моего MySQL Query, я хочу суммировать вывод equipCost по ID. т.е. я хочу, чтобы аккаунт стоил SUM’d для их аккаунта
  • 1 Реализация гибридного шифрования?
  • 1 Остановить RegEx каждый раз, когда находит определенную строку
  • 1 Новый экземпляр программы создается при прикосновении к тегу NFC
  • 0 Как добавить цвет для заполнителя angucomplete-alt
  • 1 Поток выполнения веб-приложения?
  • 1 Я хочу скачать JDK Windows 32 бит
  • 1 Дочерний элемент без корневого элемента в Java
  • 1 Изменение размера изображения не работает на PhotoImage в tkinter
  • 0 mmap и выравнивание страниц данных — это увеличивает производительность?
  • 0 Определите, какой элемент является первым, и сделайте это
  • 1 Eclipse: добавить пакет в группу классов
  • 1 Разобрать данные и представить изображение PNG
  • 0 Как использовать SOAP API с кодом входа в систему и сессией
  • 0 Разрешить регулярное выражение с обратной косой чертой
  • 1 Совместное использование нескольких фотографий с ShareMediaTask
  • 1 Я получаю сообщение об ошибке при создании адаптера списка
  • 1 FlowType: возвращаемый тип функции (k) => obj [k]
  • 0 jquery запомнить открытые пункты списка
  • 0 Связанный шаблон стека и куча ошибок
  • 1 Слияние и добавление данных с помощью Python Pandas [duplicate]
  • 0 Входные параметры как HEX из командной строки
  • 0 Доступ к HTML внутри холста
  • 1 ошибка при использовании двойной универсальности
  • 1 Не удалось создать сборку. Ссылочная сборка «Google.Apis» не имеет строгого имени.
  • 0 Windows-сокеты accept () возвращают неверное значение
  • 1 Нужен ли семафор, когда один процесс пишет, а другой читает?
  • 0 Угловой сервис возвращает пустой объект
  • 1 изменение цвета рамки текстового поля, если проверка не удалась
  • 1 Java jar-файл не может найти .dll с jna.jar
  • 1 Как определить, что для fillStyle был назначен недопустимый цвет?
  • 1 Проблема с накачкой xml-Layout в пользовательском классе макета
  • 1 Расчет площади руки с использованием данных о глубине
  • 0 Как я могу получить 3 столбца на одной строке?
  • 1 Почему деление исключений во время компиляции на ноль не производит в Eclipse IDE?
  • 0 результат поиска заменить аббревиатуру на текст
  • 0 Почему мой фон мигает белым при изменении свойства фона css с помощью набора переходов?
  • 0 Функция вызова вызова потока
  • 0 Стили электронной почты Gmail, div обертки не отображается

Array.prototype.slice()

Метод slice() возвращает новый массив, содержащий копию части исходного массива.

Интерактивный пример

Синтаксис

arr.slice([begin[, end]])

Параметры

begin Необязательный

Индекс (счёт начинается с нуля), по которому начинать извлечение.

Если индекс отрицательный, begin указывает смещение от конца последовательности. Вызов slice(-2) извлечёт два последних элемента последовательности.

Если begin не определён, slice() начинает работать с индекса 0 .

Если begin больше длины последовательности вернётся пустой массив.

Индекс (счёт начинается с нуля), по которому заканчивать извлечение. Метод slice() извлекает элементы с индексом меньше end .

Вызов slice(1, 4) извлечёт элементы со второго по четвёртый (элементы по индексам 1, 2 и 3).

Если индекс отрицательный, end указывает смещение от конца последовательности. Вызов slice(2, -1) извлечёт из последовательности элементы начиная с третьего элемента с начала и заканчивая вторым с конца.

Если end >= array.length или end опущен, slice() извлекает все элементы до конца последовательности ( arr.length ).

Возвращаемое значение

Новый массив, содержащий извлечённые элементы.

Описание

Метод slice() не изменяет исходный массив, а возвращает новую «одноуровневую» копию, содержащую копии элементов, вырезанных из исходного массива. Элементы исходного массива копируются в новый массив по следующим правилам:

  • Ссылки на объекты (но не фактические объекты): метод slice() копирует ссылки на объекты в новый массив. И оригинал, и новый массив ссылаются на один и тот же объект. То есть, если объект по ссылке будет изменён, изменения будут видны и в новом, и в исходном массивах.
  • Строки и числа (но не объекты String и Number ): метод slice() копирует значения строк и чисел в новый массив. Изменения строки или числа в одном массиве никак не затрагивает другой.

Если к любому массиву будет добавлен новый элемент, это никак не повлияет на другой массив.

Примеры

Пример: возврат части существующего массива

// Пример: наши хорошие друзья цитрусовые среди фруктов var fruits = ["Банан", "Апельсин", "Лимон", "Яблоко", "Манго"]; var citrus = fruits.slice(1, 3); // citrus содержит ['Апельсин', 'Лимон'] 

Пример: использование метода slice()

В следующем примере метод slice() создаёт новый массив, newCar , из массива myCar . Оба содержат ссылку на объект myHonda . Когда цвет в объекте myHonda изменяется на багровый, оба массива замечают это изменение.

// Используя slice, создаём newCar из myCar. var myHonda =  color: "красный", wheels: 4, engine:  cylinders: 4, size: 2.2 >, >; var myCar = [myHonda, 2, "в хорошем состоянии", "приобретена в 1997"]; var newCar = myCar.slice(0, 2); // Отображаем значения myCar, newCar и цвет myHonda // по ссылкам из обоих массивов. console.log("myCar token operator">+ myCar.toSource()); console.log("newCar token operator">+ newCar.toSource()); console.log("myCar[0].color token operator">+ myCar[0].color); console.log("newCar[0].color token operator">+ newCar[0].color); // Изменяем цвет myHonda. myHonda.color = "багровый"; console.log("Новый цвет моей Honda - " + myHonda.color); // Отображаем цвет myHonda по ссылкам из обоих массивов. console.log("myCar[0].color token operator">+ myCar[0].color); console.log("newCar[0].color token operator">+ newCar[0].color); 

Этот скрипт выведет:

= [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2, 'в хорошем состоянии', 'приобретена в 1997'] newCar = [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2] myCar[0].color = красный newCar[0].color = красный Новый цвет моей Honda - багровый myCar[0].color = багровый newCar[0].color = багровый 

Массивоподобные объекты

Метод slice() также может использоваться для преобразования массивоподобных объектов / коллекций в новый массив Array . Вам просто нужно привязать метод к объекту. Псевдомассив arguments (en-US) внутри функции как раз является примером «массивоподобного объекта».

function list()  return Array.prototype.slice.call(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3] 

Привязка может быть осуществлена посредством функции call() из прототипа функции Function.prototype (en-US), также запись может быть сокращена до [].slice.call(arguments) вместо использования Array.prototype.slice.call() . В любом случае, она может быть упрощена посредством использования функции bind() .

var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); function list()  return slice(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3] 

Совершенствование кросс-браузерного поведения

Хотя спецификация не требует от хост-объектов (например, объектов DOM) следовать поведению Mozilla при преобразовании с помощью Array.prototype.slice() и IE < 9 так не делает, версии IE, начиная с 9-й это умеют. «Прокладывание» позволяет добиться надёжного кросс-браузерного поведения. Пока другие современные браузеры будут поддерживать эту способность, что и делают в настоящее время IE, Mozilla, Chrome, Safari и Opera, разработчики, читая (поддерживающий DOM) код функции slice() , опирающийся на эту прокладку, не будут вводиться в заблуждение его семантикой; они могут смело полагаться на текущую семантику, являющуюся, видимо, де-факто стандартным поведением. (Прокладка также исправляет поведение IE, позволяя работать со вторым аргументом slice() , явно определённым как null / undefined , поскольку более ранние версии IE такое не позволяют, но все современные браузеры, в том числе IE >= 9, поддерживают данное поведение.)

/** * Прокладка для "исправления" отсутствия поддержки в IE < 9 применения slice * к хост-объектам вроде NamedNodeMap, NodeList и HTMLCollection * (технически, поскольку хост-объекты зависят от реализации, * по крайней мере, до ES2015, IE не обязан так работать). * Также работает для строк, исправляет поведение IE < 9, позволяя явно указывать undefined * вторым аргументом (как в Firefox), и предотвращает ошибки, возникающие при * вызове на других объектах DOM. */(function ()  "use strict"; var _slice = Array.prototype.slice; try  // Не может использоваться с элементами DOM в IE < 9_slice.call(document.documentElement); > catch (e)  // В IE < 9 кидается исключение// Функция будет работать для истинных массивов, массивоподобных объектов, // NamedNodeMap (атрибуты, сущности, примечания), // NodeList (например, getElementsByTagName), HTMLCollection (например, childNodes) // и не будет падать на других объектах DOM (как это происходит на элементах DOM в IE < 9)Array.prototype.slice = function (begin, end)  // IE < 9 будет недоволен аргументом end, равным undefinedend = typeof end !== "undefined" ? end : this.length; // Для родных объектов Array мы используем родную функцию slice if (Object.prototype.toString.call(this) === "[object Array]")  return _slice.call(this, begin, end); > // Массивоподобные объекты мы обрабатываем самостоятельно var i, cloned = [], size, len = this.length; // Обрабатываем отрицательное значение begin var start = begin || 0; start = start >= 0 ? start : len + start; // Обрабатываем отрицательное значение end var upTo = end ? end : len; if (end  0)  upTo = len + end; > // Фактически ожидаемый размер среза size = upTo - start; if (size > 0)  cloned = new Array(size); if (this.charAt)  for (i = 0; i  size; i++)  cloned[i] = this.charAt(start + i); > > else  for (i = 0; i  size; i++)  cloned[i] = this[start + i]; > > > return cloned; >; > >)(); 

Спецификации

Specification
ECMAScript Language Specification
# sec-array.prototype.slice

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Array.prototype.splice()
  • Function.prototype.call()
  • Function.prototype.bind()

Как проверить, пустой ли массив в Javascript, и, если он пустой, то создать его?

Это, конечно, попахивает немного, но для сведущих в JS код вполне прозрачный.

Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Rain Summers @summer_rain
VoidVolker @VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?

Если переменная является массивом — то незачем создавать еще один массив, т.к. разницы между двумя пустыми массивами нет никакой.
Возможно автор хочет провести проверку «это массив»? Проверить, является ли переменная(объект) массивом можно например так:

Object.prototype.toString.call( variableName ) == '[object Array]'

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
php, 1c-bitrix

Если под пустым массивом вы подразумеваете, что такого массива вообще нет (на такую мысль наводит ваш код, иначе зачем создавать массив с таким же именем), то вот так примерно:

try < if (someArray.length != 0) alert('Array exist.'); >catch (e) < if (e.name == "ReferenceError") < someArray = new Array(); alert ('There was no array, I made one for you!'); >>

Ну и можно добавить проверку на тип как написал @VoidVolker.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
А какой в этом тайный смысл? «Если массив пустой, создать пустой массив.» Звучит очень странно.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
arr = typeof arr !== ‘undefined’ ? arr : [];
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Romantik1991 @Romantik1991 Автор вопроса

Спасибо. Смысл чтобы не создавался массив заново много раз. И если он был создан, то пропустить создание, а если нет, то создать. Как-то так вот. Спасибо за ответы

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

if ((typeof a != "object") || !(a instanceof Array))

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

javascript

  • JavaScript
  • +4 ещё

Что за файл и что в нем?

  • 1 подписчик
  • 2 часа назад
  • 56 просмотров

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

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