2016-06-12 7 views
4

これが重複する可能性があるのか​​どうかはわかりませんが、配列の要素の配列で要素をシフトする最善の方法を考えようとしています。このように配列の別のインデックスに配列の配列を変更する

var foo = [ 
    [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ], 
    [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 8} ], 
    [ {obj: 9}, {obj: 10}, {obj: 11}, {obj: 12} ] 
]; 

IはarrayIndex所与の一つの要素を削除する場合、それは適切なアレイに進む要素の全てをシフトダウンし、その要素を除去するであろう。私はOBJ 3を除去する場合など、結果は次のようになります

var arrayIndex = 0; 
var objIndex = 2; 

var bar = foo[arrayIndex].splice(objIndex, 1); 

結果:

var arrayIndex = 1; 
var objIndex = 3; 

var bar = foo[arrayIndex].splice(objIndex, 1); 

結果:

bar = [ 
    [ {obj: 1}, {obj: 2}, {obj: 4}, {obj: 5} ], 
    [ {obj: 6}, {obj: 7}, {obj: 8}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ] 
]; 

別の例を示し除去OBJ 8のようになり

bar = [ 
    [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ], 
    [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ] 
]; 

私の問題はすべての進行要素を正しい配列位置に移動します。また、空の配列を削除したいと思います。 fooの長さがどこで減少するか。 fooも変更されます。任意の助けをいただければ幸いですhttps://jsfiddle.net/mLw8kncn/1/

は、ここに私が試みjsfiddleました。

+0

配列から要素を削除すると自動的にシフトしますが、実際には削除を使用した場合にのみ発生します。 Deleteは空のスペースを残すため、配列の長さは減少しません。スプライスを使用している場合、それは問題ではありません。 – zer00ne

+0

要素を他の配列に移動したいと気付いたので、その部分に答えようとします。 – zer00ne

+0

あなたがこれまでに試したことを示してください。 – 1983

答えて

3

単純な方法は、アイテムを2Dではなく1D配列に保存することです。次に、インデックスを操作します。

var foo = [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4}, 
    {obj: 5}, {obj: 6}, {obj: 7}, {obj: 8}, 
    {obj: 9}, {obj: 10}, {obj: 11}, {obj: 12} ]; 

function remove(arrayIndex, objIndex) { 
    var realIndex = arrayIndex * 4 + objIndex; 
    foo.splice(realIndex, 1); 
} 

それ以外の場合は、スプライス後にアイテムを並べ替える必要があります。

function remove(arrayIndex, objIndex) { 
    foo[arrayIndex].splice(objIndex, 1); 

    for (var i = arrayIndex + 1; i < foo.length; i++) { 
     var obj = foo[i].shift(); 
     foo[i - 1].push(obj); 
    } 

    if (foo[foo.length - 1].length <= 0) { 
     foo.pop(); 
    } 
} 

これは非常に複雑です。

0

配列を一時的に1次元にフラット化し(サブ配列の元のサイズを記録しておく)、その上に標準spliceを適用し、最後に記録されたサイズ情報に基づいて2D配列を再構成する関数を使用できます。

spliceの力を使って、同時に複数の要素を削除したり、同じ操作で他の要素を挿入することができます。

入力アレイは、1次元であるかのように指定されたインデックスは、したがって、インデックスでなければならない:

function splice2d(a, start, deleteCount /*, item1, item2, ...*/){ 
 
    var flat = [], sizes = []; 
 
    // Make a flat array, keeping record of subarray sizes 
 
    while (a.length) { 
 
     sizes.push(a[0].length); 
 
     flat = flat.concat(a.shift()); 
 
    }; 
 
    // Apply original splice to flat array 
 
    [].splice.apply(flat, [].slice.call(arguments, 1)); 
 
    // Reconstruct 2D array again based on sizes 
 
    while (sizes.length) { 
 
     a.push(flat.splice(0, sizes.shift())); 
 
    } 
 
    return a; 
 
} 
 

 
// Sample data 
 
var foo = 
 
    [[{obj: 1}, {obj: 2}, {obj: 3}, {obj: 4}], 
 
    [{obj: 5}, {obj: 6}, {obj: 7}, {obj: 8}], 
 
    [{obj: 9}, {obj: 10}, {obj: 11}, {obj: 12}]] 
 

 
// Mutate 
 
splice2d(foo, 2, 1); 
 
// Output result 
 
console.log(foo);

0

IはArray.prototype.reduce()このジョブのために理想的であると思います。あなたは私たちが何もしていますが、単純に配列項目は一番最後にあるから項目を削除する場合、削除するアイテムをスプライシングされていません

var  foo = [[{obj: 1}, {obj: 2}, {obj: 3}, {obj: 4}], 
 
        [{obj: 5}, {obj: 6}, {obj: 7}, {obj: 8}], 
 
        [{obj: 9}, {obj: 10}, {obj: 11}, {obj: 12}] 
 
        ], 
 
removeAndShift = (a,ai,oi) => ai == a.length-1 ? a[ai].splice(oi,1) 
 
               : a.reduce((p,c,i,a) => { if (i == ai+1) { 
 
\t                  p.splice(oi,1); 
 
\t                  p.push(c.shift()); 
 
                     } 
 
                     i > ai+1 && p.push(c.shift()); 
 
                     return c; 
 
                     }); 
 
removeAndShift(foo,1,3); 
 
console.log(foo);

ノートのようにそれを行うことができます。

+0

私はpushとshiftの前に 'c.length'をチェックする必要があると思います。あるいは、' null'が配列にプッシュされることになります。 OPがそれを望んでいない限り、質問は完全には指定されていません。 – 1983

+0

私は 'reduce'が理想的だとは言わないでしょう:あなたは純粋に副作用のためにそれを使用していますし、戻り値はあまり意味がありません。 – 1983

+0

@FizzyTea「c.length」に合致していますが、それはまだ減らされているかもしれません。私は、隣接しているいくつかのアイテムが前と同じように動いていることを考えると、このケースには理想的です。削減の( 'p.push(c.shift());')私はOPが望んでいたものとまったく同じ値を返すようにコードを修正することができましたが、はるかに秘密になります。私はこれが涼しいと思う。 – Redu

関連する問題