2016-10-20 8 views
0

を持つオブジェクトへのエンティティ/キー/値のマップ配列Iは、次の配列があります。Lodash - プロパティ

[ 
    { 
    "name": "ABC", 
    "type": "iPhone", 
    "sessions": "3.0" 
    }, 
    { 
    "name": "ABC", 
    "type": "Android", 
    "sessions": "25.0" 
    }, 
    { 
    "name": "ABC", 
    "type": "Windows", 
    "sessions": "3.0" 
    }, 
    { 
    "name": "XYZ", 
    "type": "iPhone", 
    "sessions": "1.0" 
    }, 
    { 
    "name": "XYZ", 
    "type": "Android", 
    "sessions": "11.0" 
    }, 
    { 
    "name": "XYZ", 
    "type": "Windows", 
    "sessions": "15.0" 
    }, 
    { 
    "name": "XYZ", 
    "type": "Outlook", 
    "sessions": "10.0" 
    }, 
    { 
    "name": "DEF", 
    "type": "Windows", 
    "sessions": "10.0" 
    }, 
    { 
    "name": "GHI", 
    "type": "iPhone", 
    "sessions": "10.0" 
    } 
] 

を私は次のようにlodashを使用してオブジェクトの配列にこれを変換したいと思います:

[ 
    { 
    "name": "ABC", 
    "iPhone": "3.0", 
    "Android": "25.0", 
    "Windows": "3.0", 
    "Outlook": "" 
    }, 
    { 
    "name": "XYZ", 
    "iPhone": "1.0", 
    "Android": "11.0", 
    "Windows": "15.0", 
    "Outlook": "10.0" 
    }, 
    { 
    "name": "DEF", 
    "iPhone": "", 
    "Android": "", 
    "Windows": "10.0", 
    "Outlook": "" 
    }, 
    { 
    "name": "GHI", 
    "iPhone": "10.0", 
    "Android": "", 
    "Windows": "", 
    "Outlook": "" 
    } 
] 

基本的に、プロパティをオブジェクトに統合するためのキーとして「name」プロパティを使用する必要があります。ロダッシュでこれを行う簡潔な方法は?

答えて

1

あなたはlodashの_.transform()を使用することができます。

var arr = [{"name":"ABC","type":"iPhone","sessions":"3.0"},{"name":"ABC","type":"Android","sessions":"25.0"},{"name":"ABC","type":"Windows","sessions":"3.0"},{"name":"XYZ","type":"iPhone","sessions":"1.0"},{"name":"XYZ","type":"Android","sessions":"11.0"},{"name":"XYZ","type":"Windows","sessions":"15.0"},{"name":"XYZ","type":"Outlook","sessions":"10.0"},{"name":"DEF","type":"Windows","sessions":"10.0"},{"name":"GHI","type":"iPhone","sessions":"10.0"}]; 
 

 
var result = _.transform(arr, function(products, item) { 
 
    var product = products[item.name] = products[item.name] || { 
 
     name: item.name, 
 
     iPhone: "", 
 
     Android: "", 
 
     Windows: "", 
 
     Outlook: "" 
 
    }; 
 

 
    product[item.type] = item.sessions; 
 

 
    return products; 
 
    }, {}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

0

別の解決策が考えられます。

var f = [{ 
 
    "name": "ABC", 
 
    "type": "iPhone", 
 
    "sessions": "3.0" 
 
}, { 
 
    "name": "ABC", 
 
    "type": "Android", 
 
    "sessions": "25.0" 
 
}, { 
 
    "name": "ABC", 
 
    "type": "Windows", 
 
    "sessions": "3.0" 
 
}, { 
 
    "name": "XYZ", 
 
    "type": "iPhone", 
 
    "sessions": "1.0" 
 
}, { 
 
    "name": "XYZ", 
 
    "type": "Android", 
 
    "sessions": "11.0" 
 
}, { 
 
    "name": "XYZ", 
 
    "type": "Windows", 
 
    "sessions": "15.0" 
 
}, { 
 
    "name": "XYZ", 
 
    "type": "Outlook", 
 
    "sessions": "10.0" 
 
}, { 
 
    "name": "DEF", 
 
    "type": "Windows", 
 
    "sessions": "10.0" 
 
}, { 
 
    "name": "GHI", 
 
    "type": "iPhone", 
 
    "sessions": "10.0" 
 
}]; 
 

 
var def = { 
 
    "name": "", 
 
    "iPhone": "", 
 
    "Android": "", 
 
    "Windows": "", 
 
    "Outlook": "" 
 
}; 
 

 
function updateMemo(memo, obj) { 
 
    memo[obj.name] = memo[obj.name] || _.extend({}, def, {name: obj.name}); 
 
    memo[obj.name][obj.type] = obj.sessions; 
 
    return memo; 
 
} 
 

 
console.log(_.values(_.reduce(f, updateMemo, {})));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

これは、中間オブジェクトに値を格納する配列の縮小を実行することから成ります。格納された値は、デフォルトの構造に従います。配列が作成されると、期待される出力を得るために値だけが返されます。

希望します。