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.
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);
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 inclureend
.
Utilisez ceci:
function spliceNoMutate(myArray,indexToRemove) {
return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1));
}
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" .
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']
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.
Pourquoi ne pas simplement référencer l'index?
var myArray = ["one","two","three"];
document.write(myArray[1] + '<br />');
document.write(myArray);
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.
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));
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
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"]