2016-10-03 21 views
0

私は入れ子になったオブジェクトの配列を持っています。これらのオブジェクトは、次の2つの形式の1取る:インデックスによって入れ子にされた配列からアイテムを削除します(再帰)

// type a 
{ 
    value: 'some value' 
} 

または

// type b 
{ 
    array: [ 
     object of type a or b, 
     object of type a or b, 
     ... 
    ] 
} 

ので、ベース・アレイは、無限に入れ子にすることができます。一連のインデックス(私はそれを「ツリー」と呼んでいます)が与えられているので、どのようにして1つのアイテムを削除できますか?

私がこれまで持っているもののサンプル:1(インデックスに見て、

  • が最初:[1, 3, 1, 0]

    const baseArray = [ 
        { value: 'some value' }, 
        { array: [ 
          { value: 'some value' }, 
          { array: [ 
            { value: 'some value' }, 
            { value: 'some value' }, 
           ], 
          }, 
          { value: 'some value' }, 
          { array: [ 
            { value: 'some value' }, 
            { array: [ 
              { value: 'delete me' }, 
              { value: 'some value' }, 
             ] 
            }, 
           ], 
          }, 
         ], 
        } 
    ] 
    
    const tree = [1, 3, 1, 0] 
    
    function deleteNested(tree, inputArray) { 
        const index = tree.shift(); 
        console.log(inputArray, index); 
        const child = inputArray[index].array; 
        if (tree.length > 0) { 
         console.log(child) 
         return deleteNested(tree, child); 
        } 
        return [ 
         ...inputArray.slice(0, index), 
         ...inputArray.slice(index + 1) 
        ] 
    } 
    const originalArray = baseArray.slice(0); 
    console.log(deleteNested(tree, baseArray), originalArray); 
    

    が、私はそれが「木」の場所です与えられたマークされたオブジェクトを削除したいです1の、最初の配列の0でない)値、

  • 次いで3値、
  • 次いで、1つの値を見て、
  • 最後に0値を削除します。

上記の内容は機能していませんが、私を始めました。

この関数は、任意の深度で作業するには再帰的にする必要があります。渡された配列の変更を避けるため、理想的にはsplice()を使用しないでください。新しい配列を返すべきです。

+0

すでに事前に反復回数を知っているので、ループがより適切であろうしながら、私の代わりに再帰aの推測。 – Redu

答えて

1

前回の反復回数を知っていれば、再帰的なアプローチは使用しないでください。 whileループは理想的です。

function delNestedItem(a,dm){ 
 
    var i = 0; 
 
    while (i < dm.length-1) a = a[dm[i++]].array; 
 
    a.splice(dm[i],1); 
 
} 
 

 
var data = [ 
 
    { value: 'some value' }, 
 
    { array: [ 
 
      { value: 'some value' }, 
 
      { array: [ 
 
        { value: 'some value' }, 
 
        { value: 'some value' }, 
 
       ], 
 
      }, 
 
      { value: 'some value' }, 
 
      { array: [ 
 
        { value: 'some value' }, 
 
        { array: [ 
 
          { value: 'delete me' }, 
 
          { value: 'some value' }, 
 
         ] 
 
        }, 
 
       ], 
 
      }, 
 
     ], 
 
    } 
 
      ], 
 

 
delMark = [1, 3, 1, 0]; 
 
delNestedItem(data,delMark); 
 
console.log(JSON.stringify(data,null,2));

0

ここであなたは1でそれを行う減らすことができます方法は次のとおりです。

const baseArray = [{ 
 
    value: 'some value' 
 
}, { 
 
    array: [{ 
 
    value: 'some value' 
 
    }, { 
 
    array: [{ 
 
     value: 'some value' 
 
    }, { 
 
     value: 'some value' 
 
    }, ], 
 
    }, { 
 
    value: 'some value' 
 
    }, { 
 
    array: [{ 
 
     value: 'some value' 
 
    }, { 
 
     array: [{ 
 
     value: 'delete me' 
 
     }, { 
 
     value: 'some value' 
 
     }, ] 
 
    }, ], 
 
    }, ], 
 
}]; 
 

 
const tree = [1, 3, 1, 0]; 
 

 

 
var deleted = tree.reduce(function(pos, pathIndex, index, arr) { 
 
    if (index + 1 < arr.length) { 
 
    return pos.array 
 
     ? pos.array[pathIndex] 
 
     : pos[pathIndex]; 
 
    } else { 
 
    pos.array = pos.array 
 
      .slice(0, pathIndex) 
 
      .concat(pos.array.slice(pathIndex + 1)); 
 
    return pos; 
 
    } 
 

 
}, baseArray); 
 
      
 
      console.log(baseArray); 
 
     

0

あなただけに与えられた配列から新しい配列を生成することができます削除されていない部品。

function ff(array, tree) { 
 
    function iter(array, level) { 
 
     var r = []; 
 
     array.forEach(function (a, i) { 
 
      if (tree[level] !== i) { 
 
       return r.push(a); 
 
      } 
 
      if (level + 1 !== tree.length && a.array) { 
 
       r.push({ array: iter(a.array, level + 1) }); 
 
      } 
 
     }); 
 
     return r; 
 
    } 
 
    return iter(array, 0); 
 
} 
 

 
var baseArray = [{ value: 'some value' }, { array: [{ value: 'some value' }, { array: [{ value: 'some value' }, { value: 'some value' }, ], }, { value: 'some value' }, { array: [{ value: 'some value' }, { array: [{ value: 'delete me' }, { value: 'some value' }, ] }, ], }, ], }], 
 
    tree = [1, 3, 1, 0], 
 
    copy = ff(baseArray, tree); 
 

 
console.log(copy); 
 
console.log(baseArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題