Подтвердить что ты не робот

Возвращение массива без удаленного элемента? Использование splice() без изменения массива?

Я хочу сделать что-то вроде:

var myArray = ["one","two","three"];
document.write(myArray.splice(1,1));
document.write(myArray);

Итак, он показывает сначала "один, три", а затем "один, два, три". Я знаю, что splice() возвращает удаленный элемент и изменяет массив, но существует ли функция для возврата нового массива с удаленным элементом? Я пробовал:

window.mysplice = function(arr,index,howmany){
    arr.splice(index,howmany);
    return arr;   
};

Если я попробую:

var myArray = ["one","two","three"];
document.write(mySplice(myArray,1,1));
document.write(myArray);

Он по-прежнему меняет myArray...

Пожалуйста, помогите.

4b9b3361

Ответ 1

как было предложено ниже, здесь приведен снимок кода

var myArray = ["one","two","three"];
var cloneArray = myArray.slice();

myArray.splice(1,1);

document.write(myArray);       
document.write(cloneArray);

Ответ 2

Вы хотите slice:

Возвращает одноуровневую глубокую копию части массива.

Итак, если вы

a = ['one', 'two', 'three' ];
b = a.slice(1, 3);

Тогда a будет по-прежнему ['one', 'two', 'three'], а b будет ['two', 'three']. Позаботьтесь о втором аргументе slice, хотя это еще один, чем последний индекс, который вы хотите разрезать:

Индекс, основанный на нуле, для завершения извлечения. slice извлекает до, но не включая end.

Ответ 3

Используйте это:

function spliceNoMutate(myArray,indexToRemove) {
    return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1));
}

Ответ 4

Я знаю, что этот вопрос старый, но этот подход может пригодиться.

var myArray = ["one","two","three"];
document.write(myArray.filter(function(v, index) { return index !== 1 })

или

var myArray = ["one","two","three"];
document.write(myArray.filter(function(v, index) { return v !== "two" })

В этом случае используется функция Array.filter() и проверяется как с индексом 1, либо с значением "два".


Теперь я не могу ручаться за эту производительность решения (поскольку он проверяет каждый элемент массива, Nguyen answer может быть более эффективным), но он более гибкий, если вы хотите делать более сложные вещи и, конечно, легче понять.

Ответ 5

Вы можете использовать функцию распространения ES6:

let myArray = ['one','two','three'];
let mySplicedArray = [...myArray];
mySplicedArray.splice(1,1); 

console.log(myArray); /// ['one', 'two', 'three']
console.log(mySplicedArray); /// ['one', 'three']

Ответ 6

Вместо этого:

document.write(myArray.splice(1,1));

почему бы просто не использовать:

document.write(myArray[1]);

splice() изменяет массив по определению. См. slice(), если вы хотите получить копию.

Ответ 7

Почему бы просто не ссылаться на индекс?

var myArray = ["one","two","three"];
document.write(myArray[1] + '<br />');
document.write(myArray);

Пример: http://jsfiddle.net/AlienWebguy/dHTUj/

Ответ 8

В настоящее время функциональные библиотеки, такие как ramda.js со своей функцией remove, пригождаются:

remove 
Number → Number → [a] → [a]

R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]

Удаляет список списка, начинающийся с начала индекса и содержащий элементы count. Обратите внимание, что это не разрушительно: он возвращает копию списка с изменениями. Никакие списки не пострадали при применении этой функции.

Ответ 9

Я думаю, что лучший способ склеить элемент из массива, не изменяя и не копируя сам себя, это использовать фильтр:

arr = ["one", "two", "three"]
elToRemove = "two"
filteredArr = arr.filter( n => n != elToRemove)

console.log(arr) // ["one", "two", "three"]
console.log(filteredArr) // ["one", "three"]

Ответ 10

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

Большинство ответов на этот вопрос неверны. Люди путают возвращение одного элемента одного массива без изменения его содержимого, но OP требует возврата клона массива без одного элемента.

Вот мое решение:

let arr = ['one', 'two', 'three'];

/* functional */
window.cloneSlice = (arr, start, end) => {
  const _arr = arr.slice();
  _arr.splice(start, end);
  return _arr;
}
// usage
console.log(cloneSlice(arr, 1, 1)); // one, three
console.log(arr); // one, two, three

/* prototyped */
Array.prototype.cloneSlice = function (start, end) { return cloneSlice(this, start, end) }
// usage
console.log(arr.cloneSlice(1, 1)); // one, three
console.log(arr); // one, two, three