Уменьшить и отсортировать массив объектов за один шаг - PullRequest
3 голосов
/ 29 октября 2019

Я пытаюсь получить два значения (метка и данные) из массива исходных данных, переименовать значение метки и отсортировать метку и массив данных в результирующем объекте.

Если это мои исходные данные...

const sourceData = [
    { _id: 'any', count: 12 },
    { _id: 'thing', count: 34 },
    { _id: 'value', count: 56 }
];

... результат должен быть следующим:

{ label: ['car', 'plane', 'ship'], data: [12, 34, 56] }

Таким образом, любой должен стать автомобилем , вещь должна стать плоскостью , а значение должно стать кораблем .

Но я также хочу изменить порядок элементов вмассивы результатов, использующие значения меток, которые также должны упорядочивать значения данных.

Предположим, что этот результат ожидается:

{ label: ['ship', 'car', 'plane'], data: [56, 12, 34] }

При следующем решении естьнужно две переменные (maps и order). Я думаю, что было бы лучше использовать только один вид карты, который должен устанавливать новые значения меток, а также порядок. Может с массивом ?! Прямо сейчас упорядочиваются только значения меток, но значения данных должны быть упорядочены таким же образом ...

const maps = { any: 'car', thing: 'plane', value: 'ship' }; // 1. Rename label values

const result = sourceData.reduce((a, c) => {
    a.label = a.label || [];
    a.data = a.data || [];

    a.label.push(maps[c._id]);
    a.data.push(c.count);

    return a;
}, {});

result.label.sort((a, b) => {
  const order = {'ship': 1, 'car': 2, plane: 3}; // 2. Set new order
  return order[a] - order[b];
})

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Вы можете переместить информацию в один объект.

const
    data = [{ _id: 'any', count: 12 }, { _id: 'thing', count: 34 }, { _id: 'value', count: 56 }],
    target = { any: { label: 'car', index: 1 }, thing: { label: 'plane', index: 2 }, value: { label: 'ship', index: 0 } },
    result = data.reduce((r, { _id, count }) => {
        r.label[target[_id].index] = target[_id].label;
        r.data[target[_id].index] = count;
        return r;
    }, { label: [], data: [] })

console.log(result);
1 голос
/ 29 октября 2019

Вместо разделения данных на label и data и последующей их сортировки, вы можете сначала отсортировать данные, а затем преобразовать.

const sourceData = [
    { _id: 'any', count: 12 },
    { _id: 'thing', count: 34 },
    { _id: 'value', count: 56 }
];

const maps = { any: 'car', thing: 'plane', value: 'ship' };

// Rename label values.
let result = sourceData.map(item => ({
  ...item,
  _id: maps[item._id]
}));

// Sort the data.
result.sort((a, b) => {
  const order = {'ship': 1, 'car': 2, plane: 3};
  return order[a._id] - order[b._id];
})

// Transform the result.
result = result.reduce((a, c) => {
    a.label = a.label || [];
    a.data = a.data || [];

    a.label.push(c._id);
    a.data.push(c.count);

    return a;
}, {});

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...