【问题标题】:All possible combinations of object's key and value pairs with recursion in JS对象的键和值对与JS中递归的所有可能组合
【发布时间】:2020-02-26 20:45:35
【问题描述】:

这是我写的:(标题中的关键是这里的道具)

var data = {
    dup_by: ['prop1', 'prop2', 'prop3'],
    prop1: ['val11', 'val12'],
    prop2: ['val21', 'val22'],
    prop3: ['val31', 'val32', 'val33'],
    test_obj: {},
    test_obj_arr: []
};

var dupRecursion = function(prop_index) {
      let prop_name = data.dup_by[prop_index]
      data[prop_name].forEach((value) => {
        data.test_obj[prop_name] = value
        console.log(prop_name)
        console.log(value)
        console.log(data.test_obj)
        if (prop_index == 0) {
          data.test_obj_arr = [data.test_obj, ...data.test_obj_arr]
          console.log(data.test_obj_arr)
        } else {
          dupRecursion(prop_index - 1)
        }
      })
      return;
    };

dupRecursion(data.dup_by.length - 1)

这是预期的结果:

data.test_obj_arr = [{prop1: 'val11', prop2: 'val21', prop3: 'val31'},
{prop1: 'val11', prop2: 'val21', prop3: 'val32'},
{prop1: 'val11', prop2: 'val21', prop3: 'val33'},
{prop1: 'val11', prop2: 'val22', prop3: 'val31'},
{prop1: 'val11', prop2: 'val22', prop3: 'val32'},
{prop1: 'val11', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val21', prop3: 'val31'},
{prop1: 'val12', prop2: 'val21', prop3: 'val32'},
{prop1: 'val12', prop2: 'val21', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val31'},
{prop1: 'val12', prop2: 'val22', prop3: 'val32'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'}]

有一些解决方案可以组合数组而不是对象 vals 和 props。

我已经按顺序尝试了一些更改,但它们都导致相同的输出:

data.test_obj_arr = [{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'}]

由于日志按预期输出:

console.log(prop_name)
console.log(value)

但这些不是:

console.log(data.test_obj)
console.log(data.test_obj_arr)

我认为问题出在作业中:

data.test_obj[prop_name] = value

它可以正常工作,只是不在递归内部。尝试使用 Object.Assign 也没有用。

据我所知,所有这些功能都是同步功能。

我错过了什么?

【问题讨论】:

  • 这不是有效的 JavaScript。
  • @ScottHunter 抱歉,已编辑。

标签: javascript arrays object recursion combinations


【解决方案1】:

为每个prop_x 值创建一个二维数组。然后创建一个创建一个Cartesian product 的数组。循环遍历组合并为每个组合创建一个对象,以 dup_by 作为键

const input = {
    dup_by: ["prop1", "prop2", "prop3"],
    prop1: ["val11", "val12"],
    prop2: ["val21", "val22"],
    prop3: ["val31", "val32", "val33"],
    test_obj: {},
    test_obj_arr: [],
}

const keys = input.dup_by,
      matrix = keys.map(k => input[k])

// https://stackoverflow.com/a/57597533/3082296
const combos = matrix.reduce((acc, curr, i) =>
  acc.flatMap(c => curr.map(n => [].concat(c, n)))
)

const createObject = (values) =>
  Object.fromEntries(
    keys.map((k, i) => [k, values[i]])
  )

const output = combos.map(createObject)

console.log("matrix: ", JSON.stringify(matrix))
console.log("combos: ", JSON.stringify(combos))
console.log(output)

如果不支持Object.fromEntries(),您可以使用reduce从键和值数组创建对象

const createObject = (values) =>
  keys.reduce((acc, k, i) => (acc[k] = values[i], acc), {})

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2020-12-14
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多