【问题标题】:Filter array of objects with valid data使用有效数据过滤对象数组
【发布时间】:2022-11-26 21:57:35
【问题描述】:

我有一个包含键和值的数组,例如,

  const array = [
    {
      DEVICE_SIZE: ['036', '048', '060', '070'],
    },
    {
      DEVICE_VOLTAGE: ['1', '3'],
    },
    {
      'NOT DEVICE_DISCHARGE_AIR': ['S'],
    },
    {
      'NOT DEVICE_REFRIGERANT_CIRCUIT': ['H', 'C'],
    },
  ];

由于其NOT 关键字,此处的键将对结果起主要作用。

我有每个键的原始对象数组,如以下数据,

  const data = {

    DEVICE_SIZE: [
      { id: 20, name: 'Size 20' },
      { id: 36, name: 'Size 36' },
      { id: 40, name: 'Size 40' },
      { id: 20, name: 'Size 48' },
      { id: 60, name: 'Size 60' },
      { id: 70, name: 'Size 70' },
    ],

    DEVICE_VOLTAGE: [
      { id: 1, name: 'Voltage 1' },
      { id: 2, name: 'Voltage 2' },
      { id: 3, name: 'Voltage 3' },
      { id: 4, name: 'Voltage 4' },
      { id: 5, name: 'Voltage 5' },
    ],

    DEVICE_DISCHARGE_AIR: [
      { id: 'E', name: 'Discharge E' },
      { id: 'S', name: 'Discharge S' },
      { id: 'T', name: 'Discharge T' },
    ],

    DEVICE_REFRIGERANT_CIRCUIT: [
      { id: 'C', name: 'Refrigerant C' },
      { id: 'E', name: 'Refrigerant E' },
      { id: 'H', name: 'Refrigerant H' },
      { id: 'M', name: 'Refrigerant M' },
    ],

  };

详细要求:

这里对于前两个值DEVICE_SIZEDEVICE_VOLTAGE是正例,而对于'NOT DEVICE_DISCHARGE_AIR''NOT DEVICE_REFRIGERANT_CIRCUIT'它有关键字不是.

我需要过滤上面所有给定的数组并结合正负结果,例如,

没有 NOT在关键:

例如,DEVICE_SIZE: ['036', '048', '060', '070'] 是正数(没有 NOT 关键字),所以我 需要在 DEVICE_SIZE 下获取有效 ID,即 DEVICE_SIZE: [36, 48, 60, 70]

没有在关键:

例如,'NOT DEVICE_DISCHARGE_AIR': ['S'] 是负数,所以我 需要获得有效的身份证件以外DEVICE_DISCHARGE_AIR下的值S["E", "T"]

如果有一个不是对象中的关键字,然后在映射相应的对象数组时,我需要忽略特定值并给出其他结果。

预期输出:

最终预期的有效对象是,

const valid = {
  DEVICE_SIZE: [36, 48, 60, 70],
  DEVICE_VOLTAGE: [1, 3],
  DEVICE_DISCHARGE: ["E", "T"],
  DEVICE_REFRIGERANT_CIRCUIT: ["E", "M"],
};

【问题讨论】:

    标签: javascript reactjs arrays


    【解决方案1】:

    您可以将数组转换为键/值对列表,将其展平,然后使用正则表达式从中提取可选的“NOT”前缀。在任何一种情况下,您都会得到一把钥匙。使用此键从数据数组中查找相应的 ID。如果找到“NOT”,则过滤这些数据 ID,以便排除数组中给出的那些:

    const filter = (data, filters) =>
        Object.fromEntries(
            filters.flatMap(Object.entries).map(([action, ids]) => {
                let [, not, key] = action.match(/(NOT )?(.*)/);
                let allids = data[key].map(({id}) => id);
                if (typeof allids[0] == "number") ids = ids.map(Number);
                if (not) {
                    ids = new Set(ids);
                    return [key, allids.filter(id => !ids.has(id))];
                }
                return [key, ids];
            })
        );
    
    // Your example inputs:
    const array = [{DEVICE_SIZE: ['036', '048', '060', '070'],},{DEVICE_VOLTAGE: ['1', '3'],},{'NOT DEVICE_DISCHARGE_AIR': ['S'],},{'NOT DEVICE_REFRIGERANT_CIRCUIT': ['H', 'C'],},];
    const data = {DEVICE_SIZE: [{ id: 20, name: 'Size 20' },{ id: 36, name: 'Size 36' },{ id: 40, name: 'Size 40' },{ id: 20, name: 'Size 48' },{ id: 60, name: 'Size 60' },{ id: 70, name: 'Size 70' },],DEVICE_VOLTAGE: [{ id: 1, name: 'Voltage 1' },{ id: 2, name: 'Voltage 2' },{ id: 3, name: 'Voltage 3' },{ id: 4, name: 'Voltage 4' },{ id: 5, name: 'Voltage 5' },],DEVICE_DISCHARGE_AIR: [{ id: 'E', name: 'Discharge E' },{ id: 'S', name: 'Discharge S' },{ id: 'T', name: 'Discharge T' },],DEVICE_REFRIGERANT_CIRCUIT: [{ id: 'C', name: 'Refrigerant C' },{ id: 'E', name: 'Refrigerant E' },{ id: 'H', name: 'Refrigerant H' },{ id: 'M', name: 'Refrigerant M' },],};
    
    const result = filter(data, array);
    console.log(result);

    【讨论】:

    • 感谢您的帮助,这按预期方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多