2017-09-23 5 views
2

Iは、次のようないくつかの配列を有する:アレイによれば、ネストされた特性を有するオブジェクトに配列を変換

{ 
    businessOpenAccount: { 
    'accountSettings1.page.js': {}, 
    'accountSettings2.page.js': {} 
    }, 
    mainTest: { 
    test: { 
     'test1.page.js': {}, 
     'test2.page.js': {} 
    } 
    } 
} 

[ 'businessOpenAccount', 'accountSettings1.page.js' ] 
[ 'businessOpenAccount', 'accountSettings2.page.js' ] 
[ 'mainTest', 'test', 'test1.page.js' ] 
[ 'mainTest', 'test', 'test2.page.js' ] 

私の期待される結果は、このようにオブジェクトを有することであるが実際には、配列を解析して戻すネストされたオブジェクトを作成したいが、プロパティが既に存在する場合(前の配列から定義されているため)、それをオーバーライドするのではなく、ネストの正しい順序を尊重して、その中のプロパティ。

私はreducereduceRightを使用して、いくつかのアプローチでシンプルなforEach/forループを試してみましたが、私はまだ本当に私は希望のソリューションを実現することはできません。

お願いします。

これは私がこれまで持っている最良の方法ですが、私は複数のアレイ(単一の配列との一例)上でサイクリングプロパティをオーバーライドします。

const relevantFilePath = ['businessOpenAccount', 'accountSettings.page.js']; 
 
let obj = {}; 
 
relevantFilePath.forEach((el, ind) => { 
 
    if (ind === 0) { 
 
    obj[el] = {}; 
 
    previousEl = obj[el]; 
 
    } else { 
 
    previousEl[el] = {}; 
 
    previousEl = previousEl[el]; 
 
    } 
 
}); 
 
console.log(obj);

答えて

2

あなたが与えられたを繰り返すことができオブジェクトを縮小し、分割された値を持つ最後の項目を取ります。

var data = [['businessOpenAccount', 'accountSettings1.page.js'], ['businessOpenAccount', 'accountSettings2.page.js'], ['mainTest', 'test', 'test1.page.js'], ['mainTest', 'test', 'test2.page.js']], 
 
    object = {}; 
 
    
 
data.forEach(function (a) { 
 
    var last = a.pop().split('.')[0]; 
 
    
 
    a.reduce(function (o, k) { 
 
     return o[k] = o[k] || {}; 
 
    }, object)[last] = ''; 
 
}); 
 

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

とES6オリジナルデータ

var data = [['businessOpenAccount', 'accountSettings1.page.js'], ['businessOpenAccount', 'accountSettings2.page.js'], ['mainTest', 'test', 'test1.page.js'], ['mainTest', 'test', 'test2.page.js']], 
 
    object = {}; 
 
    
 
data.forEach(function (a) { 
 
    var temp = a.slice(), 
 
     last = temp.pop().split('.')[0]; 
 
    
 
    temp.reduce((o, k) => o[k] = o[k] || {}, object)[last] = ''; 
 
}); 
 

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

+0

私は親切に私は本当にあなたを愛していると言う場合、私は失礼ですか?感謝万円! – quirimmo

0

無限の深さのサブ配列のanykindために働くだろう再帰溶液を突然変異させず。

const a = [ 
 
    ['businessOpenAccount', 'accountSettings1.page.js'], 
 
    ['businessOpenAccount', 'accountSettings2.page.js'], 
 
    [ 'businessOpenAccount', 'test1', 
 
     [ 
 
      ['test2', 'test2.settings.page.js', 
 
       [ 
 
        ['test2', 'test2.settings.page.js'], 
 
        ['test3', 'test3.settings.page.js'], 
 
       ], 
 
       'test4', 
 
      ], 
 
      ['test3', 'test3.settings.page.js'], 
 
     ] 
 
    ], 
 
    ['mainTest', 'test', 'test1.page.js'], 
 
    ['mainTest', 'test', 'test2.page.js'], 
 
]; 
 

 
const result = {}; 
 

 
const traverse = (result, arr) => { 
 
    let firstEl = arr.shift(); 
 
    if (firstEl instanceof Array) { 
 
     if (arr.length >= 1) { 
 
      traverseTop(result, firstEl); 
 
      return traverse(result, arr); 
 
     } 
 
     return traverseTop(result, firstEl); 
 
    } 
 
    firstEl = firstEl.split('.')[0]; 
 
    result[firstEl] = arr.length >= 1 ? (result[firstEl] || {}) : ''; 
 
    if (arr.length >= 1) { 
 
     return traverse(result[firstEl], arr); 
 
    } 
 
    return; 
 
}; 
 

 
const traverseTop = (result, arr) => { 
 
    arr.forEach((subArr) => { 
 
     const firstEl = subArr.shift().split('.')[0]; 
 
     result[firstEl] = result[firstEl] || {}; 
 
     traverse(result[firstEl], subArr) 
 
    }); 
 
    return result; 
 
}; 
 

 
console.log(traverseTop(result, a));

+0

あなたの努力に感謝するために、まったく正解であり、質問に対する最善の答えである別のあなたの答えをアップアップしました。私は本当に感謝しており、本当に感謝しています。しかし、このケースではニーナの解決策はよりエレガントで、のSOは、他のユーザーのためのベストソリューションを提供することです。しかし、もう一度、ありがとう百万 – quirimmo

+0

あなたは正しいです、私はもう一つエレガントでもあります:) –

+0

入れ子構造を扱うために私のコードを更新しました。私は再帰が好きです:D –

関連する問題