2015-12-23 3 views
1

У меня есть массив как это:значения группы на той же собственности

[ 
    {unit: 35, brand: 'CENTURY'}, 
    {unit: 35, brand: 'BADGER'}, 
    {unit: 25, brand: 'CENTURY'}, 
    {unit: 15, brand: 'CENTURY'}, 
    {unit: 25, brand: 'XEGAR'} 
] 

То, что я хочу, чтобы смешать jsons с той же стоимости единицы, вступив бренды через запятую, так что результирующий массив будет:

[ 
    {unit: 35, brand: 'CENTURY, BADGER'}, 
    {unit: 25, brand: 'CENTURY, XEGAR'}, 
    {unit: 15, brand: 'CENTURY'} 
] 

Кто-то предложить мне использовать filter(), я читала об этом в MDN, и то, что я не понимаю, как я мог бы использовать последний аргумент: вызывается

обратного вызова вызывается с тремя аргументами:

  1. значение элемента
  2. индекс элемента
  3. объект массив пересекаемой

я имею в виду, я это знаю это полный массив, но если я уже фильтрую его, как это мне поможет?

vm.products.filter(
    function(product, index, products){ 
     //How do I compare here if product === any product in products 
     //and then add mix them up? 
    } 
) 
+2

«Этот вопрос не показывает каких-либо исследовательских усилий» - с вопросом, как сделать что-то на самом переполнение стека не является исследование. –

+0

Я читаю о '.filter' и' .reduce' в mdn (спасибо, так чат), но я действительно не понимаю, как это сделать @JamesThorpe –

+1

Возможно, некоторые из ваших попыток использовать их тогда, вопрос о том, почему какой-то конкретный код, с которым вы работаете, не работает, а не вопрос «напишите мой код для меня». Хотя, как всегда, кажется, что другие довольны ... –

ответ

0

Итерация по элементам и генерировать новый массив

var arr = [{ 
 
    unit: 35, 
 
    brand: 'CENTURY' 
 
    }, { 
 
    unit: 35, 
 
    brand: 'BADGER' 
 
    }, { 
 
    unit: 25, 
 
    brand: 'CENTURY' 
 
    }, { 
 
    unit: 15, 
 
    brand: 'CENTURY' 
 
    }, { 
 
    unit: 25, 
 
    brand: 'XEGAR' 
 
    }], 
 
    ind = [], 
 
    res = []; 
 

 
// iterate over the array using forEach or for loop 
 
arr.forEach(function(v) { 
 
    // checking unit value is in `ind` array 
 
    var eleIn = ind.indexOf(v.unit); 
 
    if (eleIn === -1) { 
 
    // pushing unit value to `ind` array 
 
    ind.push(v.unit); 
 
    // pushing array element to `res` array 
 
    res.push(v); 
 
    } else 
 
    // else case updating brand value 
 
    res[eleIn].brand += ', ' + v.brand; 
 
}) 
 

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

+0

Есть ли более простой способ сделать это ?, возможно, используя '.filter'? –

+1

@feniixx, я добавил решение 'filter', хотя я не думаю, что он более совершенный, читаемый или простой, чем этот. – JNF

+1

np @JNF, я останусь с этим: D спасибо, хотя –

0

попробовать это

var objArray = [ 
    {unit: 35, brand: 'CENTURY'}, 
    {unit: 35, brand: 'BADGER'}, 
    {unit: 25, brand: 'CENTURY'}, 
    {unit: 15, brand: 'CENTURY'}, 
    {unit: 25, brand: 'XEGAR'} 
]; 

    var output = {}; 
    var outputArr = []; 
    for(var counter = 0; counter < objArray.length; counter++) 
    { 
     var unit = objArray[ counter ].unit; 
     if (!output [ unit ]) 
     { 
      output [ unit ] = []; 
     } 
     output [ unit ].push(objArray[ counter ].brand); 
    } 
    for (var unit in output) 
    { 
     outputArr.push({ unit: unit, brand: output[ unit ].join(",") }); 
    } 
    console.log(outputArr); 
0

я придумал несколько общего решения в this fiddle.

Что такое «field», чтобы сгруппировать данные. Когда он находит совпадение, он затем модифицирует первый объект с field и добавляет все свойства в другие экземпляры, соответствующие этому field. IE: Если вам нужно добавить дополнительные поля в экземпляр unit 35, они будут скопированы в комбинированный экземпляр. Это можно отключить, комментируя внутренний самый else.

Вот код

var data = [ 
    {unit: 35, brand: 'CENTURY'}, 
    {unit: 35, brand: 'BADGER'}, 
    {unit: 25, brand: 'CENTURY'}, 
    {unit: 15, brand: 'CENTURY'}, 
    {unit: 25, brand: 'XEGAR'} 
]; 

function groupBy(field, data) { 
    var result = []; 
    var ignore = []; 

    for (var i = 0; i < data.length; i++) { 
    var current = data[i]; 
    var isNew = true; 

    // Find matching elements 
    for (var j = 0; j < data.length; j++) { 
     var test = data[j]; 

     if (test != current && result.indexOf(test) == -1 && ignore.indexOf(test) == -1) { 
     // If their fields match 
     if (test[field] == current[field]) { 
      for (var key in test) { 
      if (test.hasOwnProperty(key) && key != field) { 
       if (current.hasOwnProperty(key)) { 
       var currentValues = current[key].split(", "); 
       currentValues.push(test[key]); 
       current[key] = currentValues.join(", "); 
       } else { 
       current[key] = test[key]; 
       } 
      } 
      } 

      // Add to ignore list 
      ignore.push(test); 
     } 
     } 
    } 

    if (ignore.indexOf(current) == -1) { 
     result.push(current); 
    } 
    } 
    return result; 
} 

var newData = groupBy('unit', data); 
console.log(JSON.stringify(newData)); 

Выходы:

[ 
    {"unit":35,"brand":"CENTURY, BADGER"}, 
    {"unit":25,"brand":"CENTURY, XEGAR"}, 
    {"unit":15,"brand":"CENTURY"} 
] 
1

OP Просил решение с использованием filter. Вот один, хотя и не лучше, чем остальные

var arr = [{ 
 
    unit: 35, 
 
    brand: 'CENTURY' 
 
}, { 
 
    unit: 35, 
 
    brand: 'BADGER' 
 
}, { 
 
    unit: 25, 
 
    brand: 'CENTURY' 
 
}, { 
 
    unit: 15, 
 
    brand: 'CENTURY' 
 
}, { 
 
    unit: 25, 
 
    brand: 'XEGAR' 
 
}] 
 
var done = []; 
 

 
var arr2 = arr.map(function(obj) { 
 
    if (done.indexOf(obj.unit)>=0) return; 
 
    done.push(obj.unit); 
 
    var arrIn = arr.filter(function(objIn) { 
 
    return obj.unit == objIn.unit; 
 
    }); 
 
    return { 
 
    unit: arrIn[0].unit, 
 
    brand: arrIn.map(function(obj2) { 
 
     return obj2.brand; 
 
    }).join(',') 
 
    }; 
 
}); 
 

 
document.write(JSON.stringify(arr2))

0

Это неразрушающий решение с Array.prototype.filter() и временный объект.

var array = [{ unit: 35, brand: 'CENTURY' }, { unit: 35, brand: 'BADGER' }, { unit: 25, brand: 'CENTURY' }, { unit: 15, brand: 'CENTURY' }, { unit: 25, brand: 'XEGAR' }]; 
 

 
function filter(a) { 
 
    var o = {}; 
 
    return JSON.parse(JSON.stringify(a)).filter(function (b) { 
 
     if (!(b.unit in o)) { 
 
      o[b.unit] = b; 
 
      return true; 
 
     } 
 
     o[b.unit].brand += ', ' + b.brand; 
 
    }); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(filter(array), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

Смежные вопросы