2017-01-21 26 views
-1

任意のオブジェクトへの配列を(配列内の)プレーンJS(ライブラリなし)で解決するための再帰的アプローチのソリューションです。基本的に私はそれ自身に同じ機能を送りたいと思う。この時点で、私は最後の反復でオブジェクトを上書きします。 私が手:オブジェクトへの配列の配列再帰的にプレーンなJSで

{firstName: "Sallito", lastName: "Jordan", age: 16, role: "server"} 

私が取得する必要がありながら:

[ 
    {firstName: 'Eren', lastName: 'Duran', age: 22, role: 'admin'}, 
    {firstName: 'Sallito', lastName: 'Jordan', age: 16, role: 'server'} 
] 

元の配列は次のとおりです。

var array = [ 
    [ 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
    ], 
    [ 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
    ] 
]; 

私の現在のそれまで解決策がある:

function transformData(array) { 
    var obj = {}; 
    for(var i = 0; i < array.length; i++){   
     for(var j = 0; j < array[i].length; j++){ 
      for(var k = 0; k < array[i][j].length; k++){ 
       if(k === 0){ 
       var currentKey = array[i][j][k]; 
       var currentValue = array[i][j][k + 1]; 
        obj[currentKey] = currentValue; 
       } 
      } 
     } 
    } 
    return obj; 
    } 

jを提供してください私はforEachとmap.reduceの方法でそれを行う方法を知っているので、再帰的なアイデアはありません。私は本当に再帰性を学びたいと思っています。ありがとう!

+5

元のデータを追加してください。 –

+0

..または再帰的な解決策がない場合...:objを上書きしないで新しいオブジェクトを古いものに配列に追加する方法は? –

+0

ニーナは、すべてここにいます...期待された結果、私のコードと私は得る結果。 ['firstName'、 'Eren']、['lastName'、 'Duran']、['age'、22]、['role'、 'admin'] ] [ ] [ 'firstNameの'、 'Sallito']、[ 'lastNameの'、 'ヨルダン']、[ '年齢'、16]、[ '役割'、 'サーバー'] ] ] //申し訳ありません! –

答えて

0

純粋なJSの場合、次のようにすることができます。

var data = [ [ ['firstName', 'Eren'], 
 
       ['lastName', 'Duran'], 
 
       ['age', 22], 
 
       ['role', 'admin'] ], 
 
      [ ['firstName', 'Sallito'], 
 
       ['lastName', 'Jordan'], 
 
       ['age', 16], 
 
       ['role', 'server'] ] 
 
      ], 
 
objData = data.map(a => a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{})); 
 
console.log(objData);

説明:私たちは、メインアレイ上.map()を適用しているし、それが各ターンに1つのコールバックによって一つだにサブアレイがa引数に割り当てられています。したがって、最初のターンではaです。今

[ ['firstName', 'Eren'], 
    ['lastName', 'Duran'], 
    ['age', 22], 
    ['role', 'admin'] ], 

aはサブアレイ項目(タプル - 値のペア)を持つ配列である、我々は、オブジェクトに参加したいと思います。したがって、.reduce()aに適用すると、この仕事には非常に便利です。

a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{}) 

我々.reduce()関数は上記のコード、...,{})の最後の部分である初期値をとるタイプです。この最初の空のオブジェクトは、コールバックの最初の引数oに割り当てられます。 ['firstName', 'Eren']のようなすべてのタプルは、コールバックの第2引数tに1ターンごとに1つずつ割り当てられます。彼らはObject.assign(o,{[t[0]]:t[1]})命令の助けによって空のオブジェクトに蓄積されます。現在の空の値oを取り込み、{firstname: "Eren"}をマージします(結合)。矢印機能は、次のターンに使用される新しいo値としてObject.assign()の出力を返します。次のターンでは

は、だから私はそれを明確に願っています... oは今 {firstname: "Eren"}あるなど t["lastname", "Duran"]であり、我々は値を代入した場合、我々は今 {firstname: "Eren", lastname: "Duran"}を返します Object.assign({firstname: "Eren"},{lastname: "Duran"})を持っており、これが私たちの新しい oとして返され、今。

+0

どのように考えている。減らすことは私にとってブラックボックスです:何、そして何、私は理解できません。私はMozzillaでoがアキュムレータであり、tが価値であることを読むことさえできますが、あなたはその解決法にどのように到着しましたか、それを前もって知っていましたか? –

+0

@Ninaショルツ再帰的ではありません – Redu

+0

このコードはjob-を行いますが、私は持っている:「私のOBJを上書きしないためにどのように...そして...ない再帰的なソリューション場合..or」彼が言及したコメントでは... –

0

再帰的な解決法についてはわかりません(この特定のケースでは必要ないと思いますが、サブアレイに多数のサブアレイがある場合は、より深いネストが存在する場合は1つ必要です。アレイ)。

現在のソリューションはほとんど機能していますが、機能の開始時ではなく、各繰り返しで新しいオブジェクトを作成するという2つの修正が必要です(以前の値が上書きされる理由です)。 。このような何か:

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 

 
function transform(data) { 
 
output=[]; 
 
data.forEach(function(el) { 
 
obj={}; 
 
for(j=0;j<el.length;j++) { 
 
obj[el[j][0]]=el[j][1]; 
 
} 
 
output.push(obj); 
 
}); 
 
return output; 
 

 
} 
 

 
console.log(transform(array));

P.S.:

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 
function transformData(array) { 
 
    
 
    final=[]; 
 
    for(var i = 0; i < array.length; i++){ 
 
    var obj = {}; // create new object inside loop -> number of objects, number of arrays 
 
     for(var j = 0; j < array[i].length; j++){ 
 
      for(var k = 0; k < array[i][j].length; k++){ 
 
       if(k === 0){ 
 
       var currentKey = array[i][j][k]; 
 
       var currentValue = array[i][j][k + 1]; 
 
        obj[currentKey] = currentValue; 
 
       } 
 
        
 
      } 
 
     } 
 
     final.push(obj); // push objects into final array 
 
    } 
 
    
 
    return final; 
 
    } 
 
    
 
    console.log(transformData(array));

ここでも、仕事をしていません(私見)簡易版であります@Redu答えはjavascript-yより多く、reduceは素晴らしいです、もちろん、これは初心者のためのものです(元のコードで何が間違っていたか説明付き)。 ;)