web-dev-qa-db-fra.com

Renvoyer un tableau sans élément supprimé? Utiliser splice () sans changer le tableau?

Je veux faire quelque chose comme:

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

Ainsi, il affiche d'abord "un, trois", puis "un, deux, trois". Je sais que splice () renvoie l'élément supprimé et modifie le tableau, mais existe-t-il une fonction permettant de renvoyer un nouveau tableau avec l'élément supprimé? J'ai essayé:

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

Si j'essaye:

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

Ça change encore mon tableau ...

S'il vous plaît aider.

27
mowwwalker

comme suggéré par la réponse ci-dessous, voici un instantané de code

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

myArray.splice(1,1);

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

Vous voulez slice :

Renvoie une copie complète à un niveau d'une partie d'un tableau.

Donc si tu

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

Alors a sera toujours ['one', 'two', 'three'] et b sera ['two', 'three']. Prenez garde avec le deuxième argument de slice, mais il s'agit d'un de plus que le dernier index que vous voulez découper:

Index de base zéro auquel mettre fin à l'extraction. slice extrait jusqu’à mais sans inclure end.

34
mu is too short

Utilisez ceci:

function spliceNoMutate(myArray,indexToRemove) {
    return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1));
}
9
Thai-Duong Nguyen

Je sais que cette question est ancienne, mais cette approche pourrait être utile.

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

ou

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

Ceci utilise la fonction Array.filter() et teste soit l'index étant 1, soit la valeur "deux" .


Maintenant, je ne peux pas garantir les performances de cette solution (car elle vérifie chaque élément du tableau, le answer de Nguyen pourrait être plus efficace), mais il est plus flexible si vous souhaitez effectuer des tâches plus complexes et sûrement plus facile à comprendre.

3
Rafael

Vous pouvez utiliser la fonctionnalité ES6 spread:

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

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

Au lieu de cela:

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

pourquoi ne pas simplement utiliser:

document.write(myArray[1]);

splice() modifie le tableau en place par définition. Voir slice() si vous voulez une copie.

0
jfriend00

Pourquoi ne pas simplement référencer l'index?

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

Exemple: http://jsfiddle.net/AlienWebguy/dHTUj/

0
AlienWebguy

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

const abc = ['aaa', 'bbb', 'ccc']
const ac = abc.filter(_ => _ !== 'bbb')

Vous voudriez faire cela pour avoir un tableau non muté.

Je ne pense pas que la performance soit aussi bonne que quelque chose comme slice + concat, mais vous inquiétez pas si cela devient un problème. Jusque-là, filter est vraiment propre.

0
corysimmons
const getSubArr = (arr, start, end) => {
    return end > start
        ? arr.filter((_, i) => i >= start && i < end)
        : arr.filter((_, i) => i >= start || i < end);
};

Cette fonction renvoie un tableau qui est une séquence du tableau d'origine. Son avantage est qu'il peut être utilisé pour obtenir un sous-tableau sans une séquence située au milieu du tableau d'origine. 

const chars = ["a", "b", "c", "d", "e", "f"];
console.log(getArrInRange(chars, 2, 4));
console.log(getArrInRange(chars, 4, 2));
0
Ben Carp

Je pense que le moyen le plus simple est de créer une fonction simple et de la lier au prototype Array si vous avez besoin d'un accès global.

La plupart des réponses fournies à la question sont fausses. Les gens confondent le fait de renvoyer un élément d'un tableau sans en modifier le contenu, mais le PO a besoin de renvoyer un clone du tableau sans un élément.

Voici ma solution:

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

0
vdegenne

Je pense que la meilleure approche pour épisser un élément d'un tableau sans muter et sans se copier est d'utiliser le filtre:

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

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