4

配列があり、1 つの要素だけを削除したいのですが、キーの順序を変更する必要はありません。アレイ全体を削除または再構築せずに簡単な方法はありますか?

または、削除後にクリーンアップして未定義の値を取り除き、長さを再度修正します。

var array = ["valueone", "valuetwo"];

console.dir(array); // keys 0 and 1
array.splice(0, 1);
console.dir(array); // key 1 is now 0, do not want!
4

3 に答える 3

7

delete配列の要素は次のようにできます。

a = ['one', 'two'];
delete a[0];

// a is now [undefined, 'two'];

a[0]または、明示的にに設定しundefinedます。

配列.lengthパラメータはシステムによって自動的に維持されることに注意してください。意図的に高い数値に設定するとundefined、欠落しているキーの値がすべて取得されます。

a.length = 10;
// a is now [undefined, 'two', undefined x 8]

これらのセマンティクスが受け入れられない場合は、Object代わりに使用を検討する必要があります。これにより、キーが保持され、おそらくより効率的になりますが、.lengthプロパティが失われます。

于 2013-03-05T21:54:13.453 に答える
2

値を undefined または null または空の文字列に明示的に設定することはできませんでした。何を達成しようとしていますか?

var arr = ['aaaa','bbb','ccc','ddd'];
    arr[0]= undefined;
    //or
    arr[0]= null;
    ///or
    arr[0]= "";
    arr.length; <--- 4
于 2013-03-05T22:00:57.647 に答える
1

2018-09-07 更新

私の意見では、この答えはあまり良くありません。JavaScript オブジェクトからプロパティを削除する方法に関する回答を提供しました。これは、長年にわたって私からはるかに注目を集めており、このケースをカバーし、より詳細に説明しています。

Array.prototype.spliceポイントは、とを使用する必要があるということですArray.prototype.slice

array.splice(start, n)シーケンシャルな要素を持つarrayfrom indexのサブセットを返し、元の配列からこのサブセットを削除し、その過程で新しい配列を作成します。startn

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"


元の答えは以下です。元のテキストを保持する場合は、なぜそれが悪いアドバイスなのかを詳しく説明する必要があります。

deletejavascriptのキーワードが使えます。

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"alertarr[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
...

この回答の以前のバージョンのアプローチを使用して同じことを行うには、不要なコード行がどれだけ必要か想像してみてください。


これが役に立ったことを願っています

うまくいけば、この更新が役に立ちました。

于 2013-03-05T22:47:42.393 に答える