2016-05-27 10 views
1

Ich wünsche die folgende Transformation durchzuführen, aber habe Probleme mit, wie es geht, nur fragen, ob jemand irgendwelche Hinweise hat:IndexBy verschachteltes Objekt Wert vom Typ Array

//Source 
[ 
    { types: ['a', 'b'] }, 
    { types: ['b'] }, 
    { types: ['a', 'c'] } 
] 
//Transformation 
{ 
    'a': [ { types: ['a', 'b'] }, { types: ['a', 'c'] } ], 
    'b': [ { types: ['a', 'b'] }, { types: ['b'] } ], 
    'c': [ { types: ['a', 'c'] } ] 
} 

Antwort

1

Verwenden reduce() mit forEach()

var data = [{ 
 
    types: ['a', 'b'] 
 
}, { 
 
    types: ['b'] 
 
}, { 
 
    types: ['a', 'c'] 
 
}]; 
 

 
var res = data.reduce(function(a, b) { 
 
    b.types.forEach(function(v) { // iterate over inner array 
 
    a[v] = a[v] || []; // define the property if not defined 
 
    a[v].push(b); // push the object refence 
 
    }); 
 
    return a; 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(res, 0, 3) + '</pre>');

Für ältere Browser prüfen Sie die Polyfill-Optionen forEch und reduce Methoden.

+0

Kühler verwenden !! Wir sind auf der gleichen Seite +1 – JagsSparrow

0

Wir .reduce von Array & Iterierte

var test = [ 
    { types: ['a', 'b'] }, 
    { types: ['b'] }, 
    { types: ['a', 'c'] } 
] 

test.reduce(function(res,obj,index){ 
    obj.types.forEach(function(x){ 
    res[x] = res[x] || []; 
    res[x].push(obj) 
    }); 
    return res; 
},{}); 
0

var data = [{ 
 
     types: ['a', 'b'] 
 
    }, { 
 
     types: ['b'] 
 
    }, { 
 
     types: ['a', 'c'] 
 
    }]; 
 

 
    var transform = function(records) { 
 
    \t var obj = {}; 
 
    \t 
 
    \t records.forEach(function(record){ 
 
    \t \t record.types.forEach(function(value){ 
 
        obj[value] = obj[value] || [] 
 
    \t \t  obj[value].push(record); 
 
    \t \t }); 
 
    \t }); 
 
    
 
    \t return obj; \t 
 
    }; 
 

 
    document.write('<pre>' + JSON.stringify(transform(data)) + '</pre>');

Verwandte Themen