Сортировать большой массив в меньший по значению в объектах - PullRequest
0 голосов
/ 05 июля 2018

У меня большой массив, который выглядит так:

let arr = [{
           'name': '1',
           'val': '12'
          },{
           'name': '4',
           'val': '52'
          },
          {
           'name': '11',
           'val': '15'
          },
          {
           'name': '4',
           'val': '33'
          },
          ...]

Я хочу найти все объекты с одинаковыми значениями name и поместить их в отдельные массивы. Постскриптум Я не знаю возможных name значений в массиве.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Сгруппируйте с reduce и отобразите вывод в массив:

let arr = [{'name': '1','val': '12'},{'name': '4','val': '52'}, {'name': '11','val': '15'},{'name': '4','val': '33'}];

// group object by same name
const dataObj = arr.reduce((all, {name, val}) => {

    if (!all.hasOwnProperty(name)) all[name] = [];
    all[name].push({name, val});
    return all;

}, {});

// map out the result into an array
const result = Object.keys(dataObj).map(k => (dataObj[k]));

console.log(result);
0 голосов
/ 05 июля 2018

Вы можете сгруппировать свой массив на основе name в накопителе объектов. Затем, используя Object.values(), вы можете получить все значения.

let arr = [{ 'name': '1', 'val': '12' },{ 'name': '4', 'val': '52' }, { 'name': '11', 'val': '15' }, { 'name': '4', 'val': '33' }],
    result = Object.values(arr.reduce((r,o) => {
      r[o.name] = r[o.name] || [];
      r[o.name].push(o);
      return r;
    },{}));
console.log(result);
0 голосов
/ 05 июля 2018

let arr=[{'name':'1','val':'12'},{'name':'4','val':'52'},{'name':'11','val':'15'},{'name':'4','val':'33'}];

let groups = arr.reduce((obj, el) => ({...obj, [el.name]: [...obj[el.name] || [], el] }), {});

console.log(groups);
0 голосов
/ 05 июля 2018

Вы можете легко группировать по имени, чтобы получить то, что вам нужно. Ниже приведена довольно общая функция для группировки любого массива объектов на карте по заданному свойству. Затем просто сделайте его массивом, и все готово

function group(arr, propertyToGroupBy) {
  return arr.reduce(function(a, b) {
    return a.set(b[propertyToGroupBy], (a.get(b[propertyToGroupBy]) || []).concat(b));
  }, new Map);
}

const map = group(arr, 'name');

console.log(Array.from(map));
<script>
  let arr = [{
      'name': '1',
      'val': '12'
    }, {
      'name': '4',
      'val': '52'
    },
    {
      'name': '11',
      'val': '15'
    },
    {
      'name': '4',
      'val': '33'
    }
  ];
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...