2017-11-23 11 views
1

去年の今日はthisを投稿しました。インデックスから項目をアレイから削除する方法を短くする

私は配列から項目を索引で削除する必要があります。インデックスによって、配列が同じ値を持つかどうかは関係ありません。あなたの典型的な例:

let arr = [1,2,3,2,1] // just an array, not array with objects 
let x = 1; 

// This will not be an expected result: 
// Find all values that is equal to 1 then remove 
arr.filter(num => num !== x) //=> [2,3,2] 

私の期待は、私が最後の要素(1)を削除する場合、例えば、配列は[1,2,3,2]する必要がありますされています

let index = 4; // which is the last "1" in the array 
let indexVal = arr.indexOf(4) // 1 
let newArray = arr.splice(indexVal, 1) //=> [1,2,3,2] 

さて、それは2017年ですが、ほとんど'18、ありますこれを行う方法がより短い(es5/6) polyfilを使わないで

編集:TODOとして本の

思う:

<ul> 
    <li>me</li> 
    <li>me</li> // click to delete this one 
    <li>you</li> 
    <li>me</li> 
</ul> 

が正しくその項目を削除するには、私はArray.filterコールバックは2つの引数を与えないvalue

+0

なぜインデックス上で 'indexOf'を呼び出そうとしていますか? – user2357112

+0

これは、 'arr.splice(arr.indexOf(4)、1))の行の1行で行うことができます。' – Alex

+0

@ user2357112私はまだ理解していますが、私は「-1」のようなものを返します。 – Sylar

答えて

7

indexで削除する必要があり、番号とインデックスを使用すると、この方法で配列をフィルタリングできます。

let arr = [1,2,3,2,1] 
let x = 4; //suppose you want to remove element at 4th index 

let editedArray = arr.filter((num, index) => index !== x) //editedArray = [1,2,3,2] 

EDIT:

第三のパラメータは、全体の配列を与えます。コメント

+1

私は 'filter'を使って「再生」していましたが、取得できませんでした。インデックス(val、index)に追加するのを忘れました。ありがとう – Sylar

+2

完了のために:フィルター機能には、現在操作しているアレイ全体を取得するための3番目のパラメーターもあります。 – Oliver

+0

*最短*バージョン: 'arr.filter((_、I)=>私は== X!)' – Kutyel

5
arr.splice(index, 1); 

でこれを指摘したりしてくれてありがとう@Oliverを、あなたは、特に最後の要素削除する場合:

arr.pop(); 

ませんindexOfコールを。 indexOfコールは決してそこにあってはいけません。 indexOfは存在しない要素に対して-1を返し、spliceは配列の最後から数えて負のインデックスを扱うので、それはうまくいったように見えます。

また、spliceは、配列内の配列を変更して、削除された要素の配列を返します。そのため、戻り値をあなたのやり方に割り当てることは誤解を招きます。

+0

あなたは両方 '.splice()'と '.pop()は'削除要素を返すことを追加したい場合があります/ sだから 'newArray = arr.splice(indexVal、1)'は実際には 'newArray = 1'を作成します –

+0

私は' arr.length'のときに何の量ですか?私はまだこれを試していない。ドキュメント '.splice(indexFromWhichToStartRemoving、numberOfElementsToRemove)'によって@Sylar – Sylar

+0

、それが実際の配列を変異させるためには、除去された要素を返します。 '.pop()'は配列の最後の要素も削除して配列を変更し、その1つの削除された要素を返します。 AnteJablanAdamović@ –

3

私は考えることができる唯一の方法は、私たちが毎日Reduxの中で使用するものである:

const arr = [1, 2, 3, 2, 1] 
const index = 4 // index of the item you want to remove 
const newArr = [...arr.slice(0, index), ...arr.slice(index + 1)] 
console.log(newArr) // [1, 2, 3, 2] 

それは最短ではないかもしれませんが、それは2017年よりであり、それは非常に重要である、不変です!

1

アジェイの答えは、あなたが探しているものかもしれません。とにかく、少し-よりライン - しかし、より多くの可読/書き換え可能/ maintableソリューションを好む私のような人がいる、私はそれをこのように行いたい:今

function removeElementByIndex(arr, x) { 
    var newArr = []; 
    for(var i = 0; i < arr.length; i++) { 
     if(i != x) { 
      newArr.push(arr[i]); 
     } 
    } 
    return newArr; 
} 
// Usage 
removeElementByIndex([1, 2, 3, 2, 1], 4);// outputs: [1, 2, 3, 2] 

を、それはほとんど、2017です18は、より短い道(es5/6)がありますか polyfilなし?

LOL!まだ実装されていない多くの基本的な事柄。私たちはJSを置き換えるために2118か別のプログラミング言語を待たなければなりません(ああ待ってください、別名jQuery:P)。

関連する問題