2017-01-09 2 views
1

Я пытаюсь использовать подчеркивание, чтобы сгруппировать мой массив объектов в меньшем списке:Group клавишами JavaScript Object + массив

var list = [ 
    { Region: 'A', Vals: [ 7, 'H' ] }, 
    { Region: 'B', Vals: [ 40, 'H' ] }, 
    { Region: 'B', Vals: [ 24, 'VH' ] }, 
    { Region: 'C', Vals: [ 4, 'VH' ] }, 
    { Region: 'A',Vals: [ 40, 'VH' ] } 
    ]; 


    var groups = _.groupBy(list, function(value){ 
     return value.Region; 
    }); 

var grouped = _.map(groups, function(group){ 
     return { 
      Region: group[0].Region, 
      Vals: group[0].Vals 
     } 
    }); 

который получит несколько близко, но не хватает некоторых из Vals. Я хочу, чтобы массивы «валсов» были объединены на основе ключей.

var list = [ 
    { Region: 'A', Vals: [ 7, 'H', 40, 'VH' ] }, 
    { Region: 'B', Vals: [ 40, 'H', 24, 'VH' ] }, 
    { Region: 'B', Vals: [ 24, 'VH' ] }, 
    { Region: 'C', Vals: [ 4, 'VH' ] } 
    ]; 

http://jsfiddle.net/77gL11c9/1/

+0

Вы можете получить все 'Vals' заменой' группы [0] .Vals' с '_.flatten (_ .pluck (группа, 'Vals')) ' –

+0

' var res = list.reduce (function (arr, v) { if (! (v.Region in ref)) { ref [v.Region] = arr. длина: arr.push ({Region: v.Region, Vals: v.Vals}); } else { [] .push.apply (arr [ref [v.Region]]. Vals, v.Vals) ; } return arr; }, []); ' –

ответ

2
list.reduce(function (memo, v) { 
    if (memo[v.Region]) { 
    memo[v.Region] = memo[v.Region].concat(v.Vals) 
    } else { 
    memo[v.Region] = v.Vals.slice() 
    } 
    return memo 
}, {}) 

Результат будет выглядеть так:

{ 
    A: [ 7, "H", 40, "VH" ], 
    B: [40, "H", 24, "VH" ], 
    C: [ 4, "VH" ] 
} 
+0

Спасибо вам большое! – Ben

1

Использование родной JavaScript Array#reduce метод с эталонным объектом для удержания индекса.

var list = [ 
 
    { Region: 'A', Vals: [ 7, 'H' ] }, 
 
    { Region: 'B', Vals: [ 40, 'H' ] }, 
 
    { Region: 'B', Vals: [ 24, 'VH' ] }, 
 
    { Region: 'C', Vals: [ 4, 'VH' ] }, 
 
    { Region: 'A',Vals: [ 40, 'VH' ] } 
 
]; 
 

 

 
// object for refering index 
 
var ref = {}; 
 

 
// iterate over the array 
 
var res = list.reduce(function(arr, v) { 
 
     // check property defined if not define and push 
 
     // value to array 
 
     if (!(v.Region in ref)) { 
 
     ref[v.Region] = arr.length; 
 
     arr.push({Region: v.Region, Vals: v.Vals}); 
 
     // if index already defined then push values 
 
     } else{ 
 
     [].push.apply(arr[ref[v.Region]].Vals, v.Vals); 
 
     } 
 
    // return the array reference 
 
    return arr; 
 
    // set initial value as empty array 
 
}, []); 
 

 
console.log(res);


UPDATE: Если вы хотите создать объект, где Region значение в качестве имени свойства и Vals значение, поскольку это значение, то сделать что-то вроде этого.

var list = [ 
 
    { Region: 'A', Vals: [ 7, 'H' ] }, 
 
    { Region: 'B', Vals: [ 40, 'H' ] }, 
 
    { Region: 'B', Vals: [ 24, 'VH' ] }, 
 
    { Region: 'C', Vals: [ 4, 'VH' ] }, 
 
    { Region: 'A',Vals: [ 40, 'VH' ] } 
 
]; 
 

 

 
// iterate over the array 
 
var res = list.reduce(function(obj, v) { 
 
    // define the property as an array if not 
 
    // already defined 
 
    obj[v.Region] = obj[v.Region] || []; 
 
    
 
    // push all values to array 
 
    [].push.apply(obj[v.Region], v.Vals); 
 
    
 
    // return the object reference 
 
    return obj; 
 
    
 
    // set initial value as an empty object 
 
}, {}); 
 

 
console.log(res);

0

Это произведет точный вывод, что вы ищете.

//first build an object with Region properties, and add the Vals to each of those properties 

var tempList = {}; 
for (var i=0; i < list.length; i++) { 
    if (!(list[i].Region in tempList)) { 
    tempList[list[i].Region] = []; 
    } 
    Array.prototype.push.apply(tempList[list[i].Region],list[i].Vals); 
} 

//then format this as an array of objects  
var groupedList = []; 
for (var region in tempList) { 
    groupedList.push({Region:region, Vals: tempList[region]}); 
} 

list = groupedList; 

После приведенного выше кода, следующий будет верно:

list = [ 
    { Region: 'A', Vals: [ 7, 'H', 40, 'VH' ] }, 
    { Region: 'B', Vals: [ 40, 'H', 24, 'VH' ] }, 
    { Region: 'B', Vals: [ 24, 'VH' ] }, 
    { Region: 'C', Vals: [ 4, 'VH' ] } 
];