2016-07-14 12 views
2

オブジェクトのプロパティ名(文字列)からなる配列の配列を持つ場合、オブジェクトが再帰的に変更され、プロパティが存在するかどうかをチェックし、それに応じて追加できます。配列の最後の値は、指定されたプロパティの文字列値として適用されます。オブジェクトのプロパティを再帰的に追加する

最終的なプロパティの値は配列の最後の項目と等しくなります(それに応じてネストされます)。

const resultingObj = { 
    propA: 'value', 
    propB: { 
     propC: { 
      propD: 'value' 
     } 
     propF: 'value' 
    } 
}; 

このようなオブジェクトを再帰的に作成したいと思います。配列の長さは不明で、サブ配列も同様です。

は、が発生せず、収容する必要がないことに注意することが重要です。それ以外の場合は入れ

const propsToAdd = [ 
    ['propA', 'value'], 
    ['propA', 'value', 'value1'] 
]; 

、(propAの子として)valueは、両方のは、プロパティ値の名前にすることはできません。

オブジェクトにキーと値のペアを追加(およびネスト)する再帰関数を作成するにはどうすればよいですか?

+0

には限界がありますプロのリストの深さ嫌い? – abigwonderful

+0

いいえありません。 – Himmel

+0

数値はここにありますか?または文字列 "値" @Himmel – Ayan

答えて

3

createRecは、ネストされた形式でオブジェクトを再帰的に作成します。

function processInput(propsToAdd) { 
 
    var resultingObj = {}, 
 
    propArr; 
 

 
    for (var i = 0, len = propsToAdd.length; i < len; i += 1) { 
 
    propArr = propsToAdd[i]; 
 
    createRec(propArr, resultingObj); 
 
    } 
 

 
    return resultingObj; 
 
} 
 

 
function createRec(propArr, resultingObj, index) { 
 
    var prop, 
 
    value_Str = 'value'; 
 
    for (var j = index || 0, len1 = propArr.length; j < len1; j += 1) { 
 
    prop = propArr[j]; 
 
    if (!resultingObj[prop]) { 
 
     resultingObj[prop] = {}; 
 
    } 
 
    if (propArr[j + 1] === value_Str) { 
 
     resultingObj[prop] = propArr[j + 1]; 
 
     j += 1; 
 
    } else { 
 
     createRec(propArr, resultingObj[prop], j + 1); 
 
     j = len1; 
 
    } 
 
    } 
 
} 
 

 
console.log(processInput([ 
 
    ['propA', 'value'], 
 
    ['propB', 'propC', 'propD', 'value'], 
 
    ['propB', 'propF', 'value'] 
 
]));

+0

@Himmelご不明な点がある場合は、確認してお知らせください。 – Ayan

+0

これは素晴らしいです、ありがとう! – Himmel

0

それは再帰バージョンではないのですが、なぜありませんか?

function createObj(propsToAdd){ 
    obj = {} 
    for(var i = 0; i < propsToAdd.length; i++){ 
     var tmp = obj; 
     var props = propsToAdd[i]; 
     for(var j = 0; j < props.length-2; j++){ 
      var prop_name = props[ j ]; 
      if(!(prop_name in tmp)) 
       tmp[ prop_name ] = {} 
      tmp = tmp[ prop_name ]; 
     } 
     if(props.length > 1) 
      tmp[ props[ j ] ] = props[ j + 1 ] 
     else 
      obj = props[0]; 
    } 
    return obj; 
} 
1

クロージャは、オブジェクトに追加されるすべてのプロパティリストを反復するためのものです。

新しいプロパティが見つかるたびに、新しいオブジェクトが作成されます。 新しいオブジェクトが追加の拡張のために送信されます。

プロパティリストの最後の値になるたびに、現在のプロパティに割り当てられます。

var addProperties = (function() { 
 

 
    var addProperties = function(object, properties) { 
 
    var currentProperty = properties.shift(); 
 
    if (properties.length === 1) { 
 
     object[currentProperty] = properties[0]; 
 
    } 
 
    else{ 
 
     if (!object.hasOwnProperty(currentProperty)) 
 
     object[currentProperty] = {}; 
 
     addProperties(object[currentProperty], properties); 
 
    } 
 
    }; 
 

 

 
    return function(object, propertiesArray) { 
 
    propertiesArray.forEach(function(propertyList) { 
 
     addProperties(object, propertyList); 
 
    }); 
 
    }; 
 

 
}()); 
 

 

 
const propsToAdd = [ 
 
    ['propA', 'value'], 
 
    ['propB', 'propC', 'propD', 'value'], 
 
    ['propB', 'propF', 'value'] 
 
]; 
 
var object = {}; 
 
addProperties(object, propsToAdd); 
 
console.log(object);

3

constのご使用はおarrow functionsdestructuring assignment、およびdefault parametersを利用することができ、ES2015を示唆しているので:

const nest = ([x, ...xs], o={}) => 
 
    xs.length === 0 ? x : (o[x] = nest(xs,o[x]), o); 
 

 
const nestmany = ([xs, ...yss], o={}) => 
 
    xs === undefined ? o : nestmany(yss, nest(xs,o)); 
 

 
const propsToAdd = [ 
 
    ['propA', 'value1'], 
 
    ['propB', 'propC', 'propD', 'value2'], 
 
    ['propB', 'propF', 'value3'] 
 
]; 
 

 
console.log(nestmany(propsToAdd));

関連する問題