Я ищу метод вставки массива JavaScript в стиле:
arr.insert(index, item)
Предпочтительно на jQuery, но на данный момент подойдет любая реализация JavaScript.
Вам нужна функция splice
на родном объекте массива.
arr.splice(index, 0, item);
вставит item
в arr
по указанному индексу (удалив сначала 0
элементов, то есть это 'просто вставка).
В этом примере мы создадим массив и добавим в него элемент в индекс 2:
var arr = [];
arr[0] = "Jani";
arr[1] = "Hege";
arr[2] = "Stale";
arr[3] = "Kai Jim";
arr[4] = "Borge";
console.log(arr.join());
arr.splice(2, 0, "Lene");
console.log(arr.join());
Вы можете реализовать метод Array.insert
следующим образом:
Array.prototype.insert = function ( index, item ) {
this.splice( index, 0, item );
};
Затем вы можете использовать его следующим образом:
var arr = [ 'A', 'B', 'D', 'E' ];
arr.insert(2, 'C');
// => arr == [ 'A', 'B', 'C', 'D', 'E' ]
Другие, чем соединения, вы можете использовать этот подход, который не будет изменять исходный массив, а создаст новый массив с добавленного элемента. Вы обычно должны избегать мутации, когда это возможно. Я'м через оператора ЕС6 выкладывать здесь.
в
const items = [1, 2, 3, 4, 5]
const insert = (arr, index, newItem) => [
// part of the array before the specified index
...arr.slice(0, index),
// inserted item
newItem,
// part of the array after the specified index
...arr.slice(index)
]
const result = insert(items, 1, 10)
console.log(result)
// [1, 10, 2, 3, 4, 5]
в
Это может использоваться, чтобы добавить более одного элемента путем настройки функции немного, чтобы использовать оператора остальных для новых элементов, распространением, что в возвращаемый результат также
в
const items = [1, 2, 3, 4, 5]
const insert = (arr, index, ...newItems) => [
// part of the array before the specified index
...arr.slice(0, index),
// inserted items
...newItems,
// part of the array after the specified index
...arr.slice(index)
]
const result = insert(items, 1, 10, 20)
console.log(result)
// [1, 10, 20, 2, 3, 4, 5]
в
Методы # пользовательский массив вставить
/* Syntax:
array.insert(index, value1, value2, ..., valueN) */
Array.prototype.insert = function(index) {
this.splice.apply(this, [index, 0].concat(
Array.prototype.slice.call(arguments, 1)));
return this;
};
В него можно вставить несколько элементов (как родной сращивания
делает) и поддерживает:
["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]
/* Syntax:
array.insert(index, value1, value2, ..., valueN) */
Array.prototype.insert = function(index) {
index = Math.min(index, this.length);
arguments.length > 1
&& this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))
&& this.insert.apply(this, arguments);
return this;
};
Он сможет объединить массивы из аргументов с данный массив, а также поддерживает:
["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-");
// "a-b-V-W-X-Y-Z-c-d"
Демо:
Если вы хотите вставить в массив сразу несколько элементов, ознакомьтесь с этим ответом на Stack Overflow: https://stackoverflow.com/questions/1348178/a-better-way-to-splice-an-arrray-into-an-array-in-javascript.
Также здесь приведены некоторые функции для иллюстрации обоих примеров:
function insertAt(array, index) {
var arrayToInsert = Array.prototype.splice.apply(arguments, [2]);
return insertArrayAt(array, index, arrayToInsert);
}
function insertArrayAt(array, index, arrayToInsert) {
Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
return array;
}
Наконец, вот jsFiddle, чтобы вы могли убедиться в этом сами:
.А вот как вы используете функции:
// if you want to insert specific values whether constants or variables:
insertAt(arr, 1, "x", "y", "z");
// OR if you have an array:
var arrToInsert = ["x", "y", "z"];
insertArrayAt(arr, 1, arrToInsert);
Для правильного функционального программирования и использования цепочки изобретение массива.прототип.вставка()
имеет важное значение. На самом деле соединения можно было бы идеально, если бы вернулся видоизмененный массив вместо совершенно бессмысленный пустой массив. Так вот он идет
в
Array.prototype.insert = function(i,...rest){
this.splice(i,0,...rest)
return this
}
var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");
в
Ну ок, с массива.прототип.метод Splice()
один изменяет исходный массив, а некоторые могут жаловаться, как "Вы должны'т изменить то, что не'т относятся к вам" и что может оказаться правильным, а также. Поэтому для общественного благосостояния я хотел бы дать еще один массив.прототип.вставка ()`, который не'т изменяет исходный массив. Вот он идет;
в
Array.prototype.insert = function(i,...rest){
return this.slice(0,i).concat(rest,this.slice(i));
}
var a = [3,4,8,9],
b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
в
Я рекомендую использовать чистый *язык JavaScript в этом случае также нет вставки метод в JavaScript, но у нас есть метод, который является встроенный массив метод, который работает для вас, это's посетило соединение...
Позвольте'посмотрим, что'ы метод Splice()...
методом Splice() изменяет содержание массива путем удаления существующие элементы и/или добавления новых элементов.
ОК, представим, что у нас этот массив ниже:
const arr = [1, 2, 3, 4, 5];
Мы можем удалить 3
, как это:
arr.splice(arr.indexOf(3), 1);
Он вернет 3, но если мы проверяем Арр Итак, мы имеем:
[1, 2, 4, 5]
Пока все хорошо, но как мы можем добавить новый элемент в массив, используя соединения? Позвольте'ы снова поставить 3 в году...
arr.splice(2, 0, 3);
Позвольте'посмотрим, что мы сделали...
Мы используем соединение снова, но на этот раз для второго аргумента мы передаем 0значит мы хотим удалить элемент, но в то же время, мы добавим третий аргумент, который является 3, которые будут добавлены на второй индекс...
Вы должны знать, что мы можем удалить и добавить в то же время, например, сейчас мы можем сделать:
arr.splice(2, 2, 3);
При этом будут удалены 2 шт на индекс 2, а затем добавить 3 по индексу 2 и результат будет:
[1, 2, 3, 5];
Это показывает, как каждый элемент в работы соединения:
массив.соединения(пуск, deleteCount, место № 1, место № 2, item3 ...)
Добавить один элемент по заданному индексу
//Append at specific position(here at index 1)
arrName.splice(1, 0,'newName1');
//1: index number, 0: number of element to remove, newName1: new element
//Append at specific position (here at index 3)
arrName[3] = 'newName1';
Добавление нескольких элемент по заданному индексу
//Append from index number 1
arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3');
//1: index number from where append start,
//0: number of element to remove,
//newElemenet1,2,3: new elements
Другим возможным решением, с использованием массив#уменьшить
.
в
var arr = ["apple", "orange", "raspberry"],
arr2 = [1, 2, 4];
function insert(arr, item, index) {
arr = arr.reduce(function(s, a, i) {
i == index ? s.push(item, a) : s.push(a);
return s;
}, []);
console.log(arr);
}
insert(arr, "banana", 1);
insert(arr2, 3, 2);
в
Даже если это был уже ответил, Я'м добавлять это примечание для альтернативного подхода.
Я хотел разместить известный номер элементов в массив в определенную позицию, как они приходят с собой "ассоциативный ряд-то" (т. е. объект), который по определению не гарантируется, чтобы быть в отсортированном порядке. Я хотел, чтобы результирующий массив должен быть массив объектов, но объекты в определенном порядке в массиве, так как массив гарантирует их порядок. Так что я сделал это.
Первый исходный объект, а строку типа JSONB извлечь из PostgreSQL. Я хотел, чтобы она отсортированный по графе "порядок" в собственность в каждый дочерний объект.
var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}';
var jsonb_obj = JSON.parse(jsonb_str);
Поскольку число узлов в объекте известно, я сначала создать массив определенной длины:
var obj_length = Object.keys(jsonb_obj).length;
var sorted_array = new Array(obj_length);
А затем итерировать объект размещения вновь созданные временные объекты в нужных местах в массиве без действительно каких-то "сортировка" не происходит.
for (var key of Object.keys(jsonb_obj)) {
var tobj = {};
tobj[key] = jsonb_obj[key].abbr;
var position = jsonb_obj[key].order - 1;
sorted_array[position] = tobj;
}
console.dir(sorted_array);
Я попытался это и он работает нормально!
var initialArr = ["India","China","Japan","USA"];
initialArr.splice(index, 0, item);
Индекс позиции, где вы хотите вставить или удалить элемент. 0, т. е. второе параметров определяет количество элементов из индекса, чтобы быть удалены изделия новые записи, которые вы хотите сделать в массиве. Это может быть один или более чем один.
initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");
Всем, кто's по-прежнему возникают проблемы с этим и попробовал все вышеперечисленные варианты и не получил. Я'обмен м мое решение, это принять внимание, что вы Дон'т Ван'т прямо указать свойства объекта против массива.
function isIdentical(left, right){
return JSON.stringify(left) === JSON.stringify(right);
}
function contains(array, obj){
let count = 0;
array.map((cur) => {
if(this.isIdentical(cur, obj)) count++;
});
return count > 0;
}
Это сочетание повторяя ссылку на массив и сравнивая его с объекта, который вы хотели проверить, преобразовать их в строку повторяется, если он соответствует. Затем вы можете просто посчитать. Это может быть улучшена, но это, где я поселился. Надеюсь, что это помогает.
Принимая прибыль уменьшить метод следующим образом:
function insert(arr, val, index) {
return index >= arr.length
? arr.concat(val)
: arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []);
}
Так что в этом случае мы можем вернуть новый массив (будет круто функциональный способ - гораздо лучше, чем использовать push или соединения) с элемент вставлен в индекс, и если индекс больше длины массива, он будет вставлен в конце.
Здесь два пути :
в
const array = [ 'My', 'name', 'Hamza' ];
array.splice(2, 0, 'is');
console.log("Method 1 : ", array.join(" "));
в
Или
в
Array.prototype.insert = function ( index, item ) {
this.splice( index, 0, item );
};
const array = [ 'My', 'name', 'Hamza' ];
array.insert(2, 'is');
console.log("Method 2 : ", array.join(" "));
в
Немного старый нить, но я вынужден согласиться с выше Редю-за сращивания наверняка имеет немного запутанный интерфейс. И ответ, который дал cdbajorin, что "это только возвращает пустой массив, если второй параметр равен 0. Если это'х больше 0, она возвращает предметы, удаленные от массива" это, в то время как точный, подтверждающие точку. Функция'намерением соединить или, как сказал Якоб Келлер, то "соединить или подключить, и менять. У вас есть массив, который вы сейчас меняется, которая предусматривает добавление или удаление элементов...." и учитывая, что возвращаемое значение из элементов, если таковые имеются, которые были удалены неудобно в лучшем случае. И я на 100% согласен, что этот метод мог бы быть лучше подходит для сцепления, если он вернулся, что кажется естественным, новый массив с элементами сплайсированные добавил. Тогда вы могли бы сделать такие вещи, как ["на 19" и, "и 17" и].соединения(1,0,"и 18" - а).присоединиться (на"...и") или как угодно с возвращенного массива. Тот факт, что она возвращает то, что было снято-это просто бред ИМХО. Если намерение способ был, чтобы "вырезать набор элементов" и это's только намерения, может быть. Кажется, если я не'т знаю, что я'м нарезка из уже хотя, я, наверное, мало причин для того чтобы снизить эти элементы, не'т его? Было бы лучше, если бы он вел себя как функция concat, карта, сократить, нарезать, и т. д., где новый массив производится из существующего массива, а не изменяющих существующий массив. Это все змеевидных, и это является существенной проблемой. Это'ы довольно часто в цепи управления массивом. Кажется, что язык должен идти в одну или другую сторону и старайтесь придерживаться его как можно больше. В JavaScript, но и быть функциональным и менее декларативной, это только кажется странным отклонением от нормы.
Здесь'ы рабочие функции, которые я использует в одном из моих приложений.
Это проверяет, если выход элемента
let ifExist = (item, strings = [ '' ], position = 0) => {
// output into an array with empty string. Important just in case their is no item.
let output = [ '' ];
// check to see if the item that will be positioned exist.
if (item) {
// output should equal to array of strings.
output = strings;
// use splice in order to break the array.
// use positition param to state where to put the item
// and 0 is to not replace an index. Item is the actual item we are placing at the prescribed position.
output.splice(position, 0, item);
}
//empty string is so we do not concatenate with comma or anything else.
return output.join("");
};
И тогда я называю его ниже.
ifExist("friends", [ ' ( ', ' )' ], 1)} // output: ( friends )
ifExist("friends", [ ' - '], 1)} // output: - friends
ifExist("friends", [ ':'], 0)} // output: friends: