Как объединить массивы объектов по вероятности в JavaScript? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть массив с 3 массивами объектов.

[
  [
    {
      VKORG: "3060",
      VTWEG: "AS",
      VRKME: "CX",
      LVORM: ""
    },
    {
      VKORG: "3060",
      VTWEG: "MF",
      VRKME: "CX",
      LVORM: ""
    }
  ],
  [
    {
      MEINH: "CX",
      UMREZ: "12",
      UMREN: "1"
    }
  ],
  [
    {
      WERKS: "3060",
      LGORT: "0011"
    },
    {
      WERKS: "3060",
      LGORT: "HU00"
    }
  ]
]

Так что я хочу объединить объекты каждого массива в них, в соответствии с вероятностью сочетания между ними ... Так что это должно выглядеть так это:

[
    {
      VKORG: "3060",
      VTWEG: "AS",
      VRKME: "CX",
      LVORM: "",
      MEINH: "CX",
      UMREZ: "12 ",
      UMREN: "1 ",
      WERKS: "3060",
      LGORT: "0011"
    },
    {
      VKORG: "3060",
      VTWEG: "MF",
      VRKME: "CX",
      LVORM: "",
      MEINH: "CX",
      UMREZ: "12 ",
      UMREN: "1 ",
      WERKS: "3060",
      LGORT: "0011"
    },
    {
      VKORG: "3060",
      VTWEG: "AS",
      VRKME: "CX",
      LVORM: "",
      MEINH: "CX",
      UMREZ: "12 ",
      UMREN: "1 ",
      WERKS: "3060",
      LGORT: "HU00"
    },
    {
      VKORG: "3060",
      VTWEG: "MF",
      VRKME: "CX",
      LVORM: "",
      MEINH: "CX",
      UMREZ: "12 ",
      UMREN: "1 ",
      WERKS: "3060",
      LGORT: "HU00"
    }
  ]
};

Как я могу сделать это с JavaScript? Я трачу много времени, чтобы сделать это с loda sh, но пока ничего.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете создать рекурсивную функцию с Array.flatMap() и Array.map(), которая объединяет массивы:

const cartesian = ([a, ...arrs]) => 
  arrs.length ? // if there are more arrays
    a.flatMap(o1 => cartesian(arrs) // run them through cartesian, and combine with current object
      .map(o2 => ({
        ...o1,
        ...o2
      }))
    ) : a // return the current array

const arrs = [[{ VKORG: "3060", VTWEG: "AS", VRKME: "CX", LVORM: "" }, { VKORG: "3060", VTWEG: "MF", VRKME: "CX", LVORM: "" }], [{ MEINH: "CX", UMREZ: "12", UMREN: "1" }], [{ WERKS: "3060", LGORT: "0011" }, { WERKS: "3060", LGORT: "HU00" }]]

const results = cartesian(arrs)

console.log(results)
1 голос
/ 15 апреля 2020

Вы можете взять стандартный алгоритм для декартового произведения и получить объединенные объекты в результате.

var data = [[{ VKORG: "3060", VTWEG: "AS", VRKME: "CX", LVORM: "" }, { VKORG: "3060", VTWEG: "MF", VRKME: "CX", LVORM: "" }], [{ MEINH: "CX", UMREZ: "12", UMREN: "1" }], [{ WERKS: "3060", LGORT: "0011" }, { WERKS: "3060", LGORT: "HU00" }]],
    result = data
        .reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
        .map(a => Object.assign({}, ...a));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...