2017-10-13 8 views
2

質問、 私はObjectはそれでいくつかの要素が含まれている必要がありオブジェクト削除ここでは要素の挙動

例:

obj = { 
    "0": { "a": "a1", "b": "b1"}, 
    "1": { "a": "a2", "b": "b2"} 
}; 

そして今、私は、element 0を削除/削除、それはそうしたいですelement 1が残っていますが、Objectから要素を削除すると予想される結果の代わりに、Arrayのように動作します。第2要素は、上記の例の最初の要素を置き換えます。10後続のすべての要素と同様に。

注:これは、オブジェクト内に2つ以上の要素が含まれており、必要ではないかもしれ最初の要素を削除しますが、それはここではオブジェクト内の任意の要素

私がこれまで行って解決することができ、

var index = 0 //just for demo purpose 

var tempArr = Object.keys(obj).map(function(key){ 
    return obj[key]; 
}); 

tempArr.splice(index,1); 

obj = tempArr.reduce(function(acc, cur, i){ 
    acc[i] = cur; 
    return acc; 
}, {}); 

結果:

obj = { 
    "0": { "a": "a2", "b": "b2"} 
} 

このソリューションの作品私が望む結果を与えましたが、これを行う方が良いですか?

編集:提案や議論の結論

私の解決策として、ほぼ同じ結果を与える問題を、解決するための別の方法として。

t.niese @による@アレクサンドル-はIonutミハイ

obj.length = Math.max.apply(null, Object.keys(obj))+1; 
Array.prototype.splice.call(obj, index, 1); 
delete obj.length; // optionally delete the length again 

によって@Anthonyマクグラス

delete obj[index]; 
obj = Object.keys(obj).reduce(function(newobj,key,i){ 
    newobj[i]=obj[key]; 
    return newobj; 
},{}); 

によって

function Delete(index) { 
    delete obj[index]; 
    var keys = Object.keys(obj); 
    var update = false; 
    for (var i = index + 1; i <= keys.length; i++) { 
     obj[i - 1] = obj[i]; 
     update = true; 
    } 
    if (update) delete obj[keys[keys.length - 1]]; 
} 

再び役立ちますおくります。

+1

の可能性のある重複:要素がある場合はどうなります[javascriptオブジェクトの名前の変更キー](https://stackoverflow.com/questions/4647817/javascript-object-rename-key) –

+0

途中で削除されましたか? – qxg

+0

@TavishAggarwalはい。オブジェクトが2つの要素しか持たない場合は、それは答えになります。オブジェクトが多くの要素を持つ場合、それはループ内の問題を使用することができます。これは回避しようとしています。 – Dean

答えて

1

数値キーだけがある場合は、lengthを追加してオブジェクトのような配列に変換してから、spliceを呼び出してください。

obj = { 
 
    "0": { "a": "a1", "b": "b1"}, 
 
    "1": { "a": "a2", "b": "b2"}, 
 
    "2": { "a": "a3", "b": "b3"}, 
 
    "3": { "a": "a4", "b": "b4"} 
 
}; 
 

 
var index = 1; 
 

 
obj.length = Math.max.apply(null, Object.keys(obj))+1; 
 
Array.prototype.splice.call(obj, index, 1); 
 
delete obj.length; // optionally delete the length again 
 

 
console.dir(obj)

1

あなただけreduce方法でそれを行うことができます。

また、この程度object

obj = { 
 
    "0": { "a": "a1", "b": "b1"}, 
 
    "1": { "a": "a2", "b": "b2"} 
 
}; 
 
delete obj['0']; 
 
newobj=Object.keys(obj).reduce(function(newobj,key,i){ 
 
    newobj[i]=obj[key]; 
 
    return newobj; 
 
},{}); 
 
console.log(newobj);

1

方法から1つのプロパティを削除するために、delete演算子を使用できますか?

obj = { 
    "0": { "a": "a1", "b": "b1"}, 
    "1": { "a": "a2", "b": "b2"} 
}; 

function Delete(p) { 
    delete obj[p]; 
    var keys = Object.keys(obj); 
    var update = false; 
    for (var i = p + 1; i <= keys.length; i++) { 
     obj[keys[i] - 1] = obj[keys[i]]; 
     update = true; 
    } 
    if (update) 
     delete obj[keys[keys.length - 1]]; 
} 

Delete(0); // delete first element 
0

移動する必要があるすべてのインデックスを取って、それに新しいインデックス/キーを付けることができます。最後に不要な最後のオブジェクトを削除します。

function deleteFromObject(object, index) { 
 
    Object.keys(object).slice(index + 1).forEach(function (k) { 
 
     object[index++] = object[k]; 
 
    }); 
 
    delete object[index]; 
 
} 
 

 
var object = { 0: { a: "a1", b: "b1" }, 1: { a: "a2", b: "b2" }, 2: { a: "a3", b: "b3" }, 3: { a: "a4", b: "b4" } }; 
 

 
deleteFromObject(object, 0); 
 
console.log(object); 
 

 
deleteFromObject(object, 2); 
 
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題