【问题标题】:Array groupping with condition in javascript在javascript中使用条件进行数组分组
【发布时间】:2023-01-08 22:49:40
【问题描述】:

所以我有一系列来自 BE 的响应,其结构如下:

    const answer= [
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "34",
    "Shift Running": "3",
    "SKU Number": "310902",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "34",
    "Shift Running": "2",
    "SKU Number": "310902",
    "RPH Input": "Revisi"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "36",
    "Shift Running": "3",
    "SKU Number": "300360",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "36",
    "Shift Running": "3",
    "SKU Number": "310907",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "37",
    "Shift Running": "3",
    "SKU Number": "310908",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "43",
    "Shift Running": "1",
    "SKU Number": "310101",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-06",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "44",
    "Shift Running": "2",
    "SKU Number": "321294",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-06",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "44",
    "Shift Running": "3",
    "SKU Number": "300079",
    "RPH Input": "Revisi"
  }
];

如果“Tanggal”、“Plant”、“Gedung/Zona”、“sektor”、Line 和 SKU 编号相同(不包括班次编号)但 RPH 输入值为“Revisi”,我尝试将其分组为日期", 它只会对来自 RPH 输入的值进行分组,该值具有值 revisi 而不是 Planned (H-1),预期数组是这样的,日期的值是 Shift Running 的累积值(这里是预期的大批):

const tranfrdata=[{ "2023-01-05": 12,
  "2023-01-06": 5 }]

可以根据我上面提到的逻辑对其进行分组,是否可以这样做?或者有什么帮助吗?

【问题讨论】:

  • 我很难理解这个问题。只是您要按日期添加 Shift Running,但不包括 Revisi 的 RPH Input?我们可以忽略其他字段吗?
  • 嗯,不排除,假设我有两个条件,其中 tanggal、plant、gedung 等具有相同的值,但 RPH 输入有“Planned H-1”和“Revisi”,所以它只选择“Revisi”而不是“计划的 H-1”,以及按日期运行的加班。
  • 啊,我想我现在明白了。
  • 先生有什么帮助吗? @本斯蒂芬斯
  • 源数据中是否可以有两个具有相同 Tanggal、Plant、Gedung / Zona、Sektor、Line、SKU Number 和 RPH Input 的项目?

标签: javascript arrays object


【解决方案1】:

如果我正确理解你的问题,我认为最好的方法是将数组分隔为Planned (H-1)Revisi,然后迭代第一个数组并使用SKU编号检查它是否存在于第二个数组中,如果不存在' 只从第一个数组累加,如果是,从第二个数组累加:

const answer= [
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "34",
    "Shift Running": "3",
    "SKU Number": "310902",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "34",
    "Shift Running": "2",
    "SKU Number": "310902",
    "RPH Input": "Revisi"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "36",
    "Shift Running": "3",
    "SKU Number": "300360",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "36",
    "Shift Running": "3",
    "SKU Number": "310907",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "9",
    "Line": "37",
    "Shift Running": "3",
    "SKU Number": "310908",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-05",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "43",
    "Shift Running": "1",
    "SKU Number": "310101",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-06",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "43",
    "Shift Running": "2",
    "SKU Number": "321294",
    "RPH Input": "Planned (H-1)"
  },
  {
    "Tanggal": "2023-01-06",
    "Plant": "Ranc",
    "Gedung / Zona": "Zona 2",
    "Sektor": "11",
    "Line": "44",
    "Shift Running": "3",
    "SKU Number": "300079",
    "RPH Input": "Planned (H-1)"
  }
];

const planned = answer.filter(obj => obj["RPH Input"] === "Planned (H-1)")
const revisi = answer.filter(obj => obj["RPH Input"] === "Revisi")

const transferData = planned.reduce((acc, curr) => {
  const revisiObj = revisi.findLast(obj => obj["SKU Number"] === curr["SKU Number"])
  let finalObj = curr
  if (revisiObj) {
    finalObj = revisiObj
  }
  return {
    ...acc,
    [finalObj["Tanggal"]]: finalObj["Tanggal"] in acc ? acc[finalObj["Tanggal"]] + Number(finalObj["Shift Running"]) : Number(finalObj["Shift Running"])
  }
}, {})

console.log(transferData)

【讨论】:

  • 兄弟出错了……“revisi.findLast 不是一个函数”
  • 但答案已经是我所期望的..
  • @nabatiadmin 如果错误发生在你应用代码之后,那么很难从这里调试,你这边可能有一些不同的结构,也许尝试将 findLast 更改为 find 并查看它是否有效
  • 它可以工作,但是当它出现不同的情况时,我认为它有一些问题......,先生,你介意看一下吗? @达姆扎基
  • 更新了问题...
【解决方案2】:
  1. 创建一个空对象 groupedData,它将存储分组 数据。
  2. 循环遍历答案数组中的元素。
  3. 对于每个元素,检查 Tanggal、Plant、Gedung / Zona、 Sektor、Line、Shift Running 和 SKU Number 属性相同 作为当前元素。如果是,并且 RPH 输入是“Revisi”, 将 Shift Running 属性的值添加到 groupedData 相应日期的对象。如果 RPH 输入不是“Revisi”, 跳过元素。
  4. 循环后,groupedData 对象将包含分组 数据。然后您可以使用 Object.entries(groupedData) 将其转换为 一组键值对,然后您可以进一步操作 如所须。

    const answer= [
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "9",
        "Line": "34",
        "Shift Running": "3",
        "SKU Number": "310902",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "9",
        "Line": "34",
        "Shift Running": "2",
        "SKU Number": "310902",
        "RPH Input": "Revisi"
      },
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "9",
        "Line": "36",
        "Shift Running": "3",
        "SKU Number": "300360",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "9",
        "Line": "36",
        "Shift Running": "3",
        "SKU Number": "310907",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "9",
        "Line": "37",
        "Shift Running": "3",
        "SKU Number": "310908",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-05",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "11",
        "Line": "43",
        "Shift Running": "1",
        "SKU Number": "310101",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-06",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "11",
        "Line": "43",
        "Shift Running": "2",
        "SKU Number": "321294",
        "RPH Input": "Planned (H-1)"
      },
      {
        "Tanggal": "2023-01-06",
        "Plant": "Ranc",
        "Gedung / Zona": "Zona 2",
        "Sektor": "11",
        "Line": "44",
        "Shift Running": "3",
        "SKU Number": "300079",
        "RPH Input": "Planned (H-1)"
      }
    ]
    
    const groupedData = {};
    
    for (const element of answer) {
      if (element['RPH Input'] === 'Revisi') {
        if (
          element['Tanggal'] === element['Tanggal'] &&
          element['Plant'] === element['Plant'] &&
          element['Gedung / Zona'] === element['Gedung / Zona'] &&
          element['Sektor'] === element['Sektor'] &&
          element['Line'] === element['Line'] &&
          element['Shift Running'] === element['Shift Running'] &&
          element['SKU Number'] === element['SKU Number']
        ) {
          if (!groupedData[element['Tanggal']]) {
            groupedData[element['Tanggal']] = 0;
          }
          groupedData[element['Tanggal']] += element['Shift Running'];
        }
      }
    }
    
    const tranfrdata = Object.entries(groupedData);
    console.log(groupedData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多