一步减少和排序对象数组

4

我正在尝试从我的源数据数组中获取两个值(标签和数据),重命名标签值并在结果对象中对标签和数据数组进行排序。

如果这是我的源数据...

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

最终结果应该是:

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

因此,任何any都应变为carthing应变为plane,而value应变为ship

但我还想使用标签值改变结果数组中的元素顺序,这也应该按照数据值排序。

假设预期结果如下:

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

以下方案需要两个变量(mapsorder)。我认为最好只使用一种地图,该地图应设置新标签值并确定顺序。也许可以使用数组?!目前仅对标签值进行排序,但数据值应以相同方式排序...

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];
})

1
“我认为这样做会更好…”. 为什么?较少的代码并不代表它本身就更“好”。 - RobG
@RobG 您说得对。但我需要设置一个变量,用于新的标记和排序。我认为只设置一个变量会更容易。我多次使用该代码。使用两个变量可能会增加一些配置错误。这就是为什么我想使用一个变量的原因。 - user3142695
你可能可以通过对插入排序进行一些修改,使其在此之前也执行映射步骤,从而立即运行它,但是...为什么呢?你试图通过将这两个步骤结合起来解决什么问题?我认为,与 reduce -> sort(或 sort -> reduce)相比,这最终会使代码难以阅读和维护。 - VLAZ
@VLAZ 或许你是对的。我会考虑你的想法。但现在数据还没有按标签排序... - user3142695
如果唯一的问题是两个变量之间存在不匹配,为什么不只使用一个变量呢?可以像这样定义一个常量:const config = { any: { value: 'car', order: 2}, thing: { value: 'plane', order: 3}, value: { value: 'ship', order: 1} } - VLAZ
2个回答

1

不必将数据分成标签数据,然后一起排序,可以先排序数据,然后再进行转换。

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);


1
你可以将信息移入一个单独的对象中。

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接