Ответ 1
как было предложено ниже, здесь приведен снимок кода
var myArray = ["one","two","three"];
var cloneArray = myArray.slice();
myArray.splice(1,1);
document.write(myArray);
document.write(cloneArray);
Я хочу сделать что-то вроде:
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...
Пожалуйста, помогите.
как было предложено ниже, здесь приведен снимок кода
var myArray = ["one","two","three"];
var cloneArray = myArray.slice();
myArray.splice(1,1);
document.write(myArray);
document.write(cloneArray);
Вы хотите slice
:
Возвращает одноуровневую глубокую копию части массива.
Итак, если вы
a = ['one', 'two', 'three' ];
b = a.slice(1, 3);
Тогда a
будет по-прежнему ['one', 'two', 'three']
, а b
будет ['two', 'three']
. Позаботьтесь о втором аргументе slice
, хотя это еще один, чем последний индекс, который вы хотите разрезать:
Индекс, основанный на нуле, для завершения извлечения.
slice
извлекает до, но не включаяend
.
Используйте это:
function spliceNoMutate(myArray,indexToRemove) {
return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1));
}
Я знаю, что этот вопрос старый, но этот подход может пригодиться.
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, либо с значением "два".
Вы можете использовать функцию распространения ES6:
let myArray = ['one','two','three'];
let mySplicedArray = [...myArray];
mySplicedArray.splice(1,1);
console.log(myArray); /// ['one', 'two', 'three']
console.log(mySplicedArray); /// ['one', 'three']
Вместо этого:
document.write(myArray.splice(1,1));
почему бы просто не использовать:
document.write(myArray[1]);
splice()
изменяет массив по определению. См. slice()
, если вы хотите получить копию.
Почему бы просто не ссылаться на индекс?
var myArray = ["one","two","three"];
document.write(myArray[1] + '<br />');
document.write(myArray);
В настоящее время функциональные библиотеки, такие как 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. Обратите внимание, что это не разрушительно: он возвращает копию списка с изменениями. Никакие списки не пострадали при применении этой функции.
Я думаю, что лучший способ склеить элемент из массива, не изменяя и не копируя сам себя, это использовать фильтр:
arr = ["one", "two", "three"]
elToRemove = "two"
filteredArr = arr.filter( n => n != elToRemove)
console.log(arr) // ["one", "two", "three"]
console.log(filteredArr) // ["one", "three"]
Я думаю, что самый лучший способ - создать простую функцию и связать ее с прототипом 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