【问题标题】:How to recursively split/flatten an object with Arrays如何使用数组递归拆分/展平对象
【发布时间】:2020-10-30 22:42:35
【问题描述】:

如果对象具有一些值作为数组,我正在尝试递归拆分某种扁平对象。

  • 如果没有值是数组,它应该按原样返回对象。
  • 如果有一个值是空白数组,它应该按原样返回对象,但用空白字符串替换该数组值
  • 如果有多个数组值,它应该返回对象的扁平化拆分。例如,如果有一个带有数组的对象,例如:
{
    "wq": "e2201b13-aa03-4044-b4e3-1ecb25ef5083",
    "we": "2019-08-19T00:00:00",
    "er": "2019-09-18T00:00:00",
    "rt": "PAID",
    "ty": "300.00",
    "yu": "27.27",
    "ui": "272.73",
    "io": "0",
    "op": "300.00",
    "pa": "8df30d22-5af3-4d61-a420-566ccdad8cdf",
    "as": "AUD",
    "sd": false,
    "df": false,
    "fg": "2019-12-04T19:57:48",
    "gh": "2019-09-16T00:00:00",
    "hj": "0",
    "jk": [
        "6c9809af-269b-4b86-8b07-78c83a12bd18",
        "6c9809af-269b-4b86-8b07-78c83a12bd19"
    ],
    "lk": [
        '112',
        '111',
    ],
    "zx": null,
    "xc": "",
    "vb": []
}

它应该返回一个包含 4 个对象的数组,用于所有这些对象的排列。其中 lk、jk 和 vb 的值是字符串。 vb 总是空白的,因为它是一个空白对象。如果源对象中的 vb 是这样的 '' 即空白字符串,那将是相同的。 4 个对象,因为有 2 个数组,每个数组有 2 个对象。 2^2 = 4。例如,如果 vb 也有 2 个对象,那么将有 2^3=8 个对象,所有其他键都相同,但上面提到的 3 个键是字符串。

  • 数组中的值未知。因此,它可以是任意数量的 od 值,范围从 0-n
  • 源对象中可以是数组的键未知。因此需要递归遍历。
  • 源对象中的值也可以是 null 或 {} 对象,可以忽略。

到目前为止,我已经编写了一个这样的启动器:

const result = [];
const reserve = {};

Object.keys(source).forEach((key) => {
    if (source[key] instanceof Object) {
        // const isArr = Array.isArray(source[key]);
        source[key].forEach((element) => {
            result.push({
                ...source,
                [key]: element
            });
        });
    } else {
        reserve[key] = source[key]
    }
})

console.log(result)
// console.log(reserve)
// console.log(result.map(i => Object.assign({}, i, reserve)))

它在某种程度上给了我想要的输出,但仍然需要工作。欢迎任何建议和建议。

【问题讨论】:

  • 我确实遇到了一些建议,但它们没有提供所需的输出。
  • but still needs work not giving desired output. 不是很有用的用例语句
  • 请添加想要的结果。

标签: javascript arrays ecmascript-6 flatten


【解决方案1】:

假设您希望得到一个笛卡尔积并将空数组保留为单个值,您可以关注这些数据。

如果带有对象的数组再次调用 getCartesian 并构建新对象,您可以采用递归函数来分离所有键/值对并通过迭代值来构建新的笛卡尔积。

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) && v.length ? v : [v]).forEach(w =>
                (w && typeof w === 'object' && (!Array.isArray(w) || w.length) ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var data = { wq: "e2201b13-aa03-4044-b4e3-1ecb25ef5083", we: "2019-08-19T00:00:00", er: "2019-09-18T00:00:00", rt: "PAID", ty: "300.00", yu: "27.27", ui: "272.73", io: "0", op: "300.00", pa: "8df30d22-5af3-4d61-a420-566ccdad8cdf", as: "AUD", sd: false, df: false, fg: "2019-12-04T19:57:48", gh: "2019-09-16T00:00:00", hj: "0", jk: ["6c9809af-269b-4b86-8b07-78c83a12bd18", "6c9809af-269b-4b86-8b07-78c83a12bd19"], lk: ["112", "111"], zx: null, xc: "", vb: [] };

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

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2019-06-30
    • 2018-04-20
    • 2015-07-14
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多