2018-09-07 更新
私の意見では、この答えはあまり良くありません。JavaScript オブジェクトからプロパティを削除する方法に関する回答を提供しました。これは、長年にわたって私からはるかに注目を集めており、このケースをカバーし、より詳細に説明しています。
Array.prototype.splice
ポイントは、とを使用する必要があるということですArray.prototype.slice
。
array.splice(start, n)
シーケンシャルな要素を持つarray
from indexのサブセットを返し、元の配列からこのサブセットを削除し、その過程で新しい配列を作成します。start
n
let array = [1,2,3,4,5,6];
array.splice(2,3); // [3,4,5]
array; // [1,2,6]
array.slice(start, end)
array
元のインデックスを変更せずに、インデックスからインデックスstart
へのサブセットを返しますend
。動作は とは少し異なりsplice
ますarray.slice(start, start + n)
。
let array = [1,2,3,4,5,6];
array.slice(2, 2 + 3); // [3,4,5]
array; // [1,2,3,4,5,6]
もちろん、インデックスをやのような番兵値に設定することもできますが、削除後も配列を同じ順序に保ちたい場合は、アプローチを変更する必要があります。なぜインデックス 1 にする必要があるのでしょうか。内容がアクセスに必要なキーと常に同じである場合、このデータ構造にどのような有用な情報が保持されているのでしょうか?null
""
"valuetwo"
元の答えは以下です。元のテキストを保持する場合は、なぜそれが悪いアドバイスなのかを詳しく説明する必要があります。
delete
javascriptのキーワードが使えます。
delete array[index];
これをしないでください。配列が同種である場合 (そうあるべきです)、これにより、2 番目の型 ( undefined
) が導入されて配列が破損します。array.splice()
上記のように使用する必要があります。これにより、指定された範囲が省略された新しい配列が作成されます。
残念ながら、これによりundefined
配列内にインデックスが作成されます
var arr = ['pie', 'cake', 'fish'];
delete arr[1];
arr; // ['pie', undefined, 'fish']
適例。
これを行うこともできます:
var arr = [9,8,7,6];
arr[1] = null;
arr; // [9,null,7,6]
arr.length; // 4
var i = -1;
while(++i < arr.length){
if(arr[i] && typeof(arr[i] === "number")){
alert(arr[i]);
}
}
できますが、すべきではありません。これは不要であり、何の役にも立たないだけでなく (これは を呼び出すだけなalert
ので)、実際には壊れています。
if(arr[i] && typeof(arr[i] === "number")){
alert(arr[i]);
}
これは、ゼロ以外の数値の場合にのみ要素を出力すると予想されるかもしれませんが、実際には 、 、 などの値に対しても実行"foo"
され[]
ます。したがって、true と評価されます。つまり、呼び出されるための唯一の要件は、それが真実であることです。この if ステートメントが実行されない原因となる値は、言語全体で 6 つしかありません。document.createElement("p")
typeof(arr[i] === "number")
"boolean"
alert
arr[i]
undefined
null
0
""
(「空の文字列」と発音します)
false
NaN
または、配列を使用する必要がない場合は、オブジェクトを使用してすべてを簡単にすることができます。
var obj = {
0: "first",
1: "second",
2: "third"
};
delete obj[1];
obj; // {0: "first", 2: "third"}
for(var i in obj){
alert(obj[i]);
}
これは、配列を使用する利点をすべて瞬時に消し去ってしまいます。これで、異種であるかどうかに関係なく、適切な方法でフィルター処理、マップ、縮小、または変換できないデータセットがあり、次のようなことに頼らfor(i in obj)
なければなりません (勇気がある場合、これは非常にバグが発生しやすいです) jQuery などのライブラリを使用して、それを反復処理します。幸いなことに、今日では のような派手なものがObject.keys(obj).map(k => obj[k]).forEach(function(el){ ... })
ありますが、だからといってデータ構造が悪いという言い訳にはなりません。
オブジェクトの長さを取得するには:
getLength = function(obj){
var i = 0, l = 0;
for(i in obj){
l++;
}
return l;
}
getLength(obj); // 3
繰り返しますが、配列の場合、これは不要です。
ただし、オブジェクトdate of creation
は名前ではなく > でインデックスをソートすることに注意してください。ただし、これによって障害が発生することはありません。
オブジェクトのインデックスをアルファベット順に並べ替えるには:
sortObject = function (){
var arr = [], i;
for(i in this){
arr.push({index:i,content:this[i]});
delete this[i];
}
arr.sort();
for(i in arr){
var item = arr[i];
this[item.index] = item.content;
}
return this; // make chainable
}
var obj = {
acronym: "OOP",
definition: "Object-Oriented Programming",
article: "http://wikipedia.org/OOP"
};
sortObject.apply(obj); // indices are "acronym", "article", "definition"
array.sort(fn)
とにかく、オブジェクトの要点は、そのプロパティがソートされていないことです。ソートされていないリストをソートしても、ほとんど役に立ちません。
配列を行う際に配列がどれだけ優れているかを説明するだけです。
let array = ["pie", "cake", "fish", "brownie", "beef", ...];
/* do some stuff... */
array
.filter(el => exclude.indexOf(el) === -1)
.forEach(function(el){
console.log(el);
});
の場合、コンソールに次のログが記録されますexclude
。["cake", "brownie"]
pie
fish
beef
...
この回答の以前のバージョンのアプローチを使用して同じことを行うには、不要なコード行がどれだけ必要か想像してみてください。
これが役に立ったことを願っています
うまくいけば、この更新が役に立ちました。