微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript:合并笛卡尔对象数组

如何解决Javascript:合并笛卡尔对象数组

我有以下对象数组

{
 "roleid":[{"rolename":[1639]}],"modnameid":[{"mname":[1516,1515,1514]}],"accesstype":[{"accesstype":["VO","AA"]}]
}

我想在下面转换它的格式

[
{"modnameid":1516,"accesstype":"VO","roleid":1639},{"modnameid":1516,"accesstype":"AA",{"modnameid":1515,{"modnameid":1514,"roleid":1639}
]

我们怎么做,基本假设什么基于多层地图的操作,思考的食物 感谢您的帮助!

解决方法

可以用户

let data = {
    "roleid": [{ "rolename": [1639] }],"modnameid": [{ "mname": [1516,1515,1514] }],"accesstype": [{ "accesstype": ["VO","AA"] }]
}
let roles = []
data.roleid.forEach(element => {
    roles = [...roles,...element.rolename]
});

let names = []
data.modnameid.forEach(element => {
    names = [...names,...element.mname]
});

let types = []
data.accesstype.forEach(element => {
    types = [...types,...element.accesstype]
});

let informations = []
roles.forEach(role => {
    names.forEach(name => {
        types.forEach(type => {
            informations.push({ "modnameid": role,"accesstype": type,"roleid": name })
        });
    });
});

console.log(informations);

,

除了硬编码的答案之外,您还可以采用动态方法,首先获得一个包含平面数据数组的对象,然后构建一个笛卡尔积数组。

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

const
    data = { roleid: [{ rolename: [1639] }],modnameid: [{ mname: [1516,accesstype: [{ accesstype: ["VO","AA"] }] },flat = v => v && typeof v === 'object'
        ? Object.values(v).flatMap(flat)
        : v;
    temp = Object.fromEntries(Object.entries(data).map(([k,v]) => [k,flat(v)]));

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。