javascript 对象的笛卡尔积,具有不同类型的值,如字符串、对象和数组

Cartesian product of javascript object with different types of values like string, object and array

我正在做作业。 我有以下对象形式。

{
    name: "name here",
    skills:  [ "cash", "shares" ],
    subjects: 
    [ 
      {
        subName: "subject1",
            remark: ['remark1', 'remark2']
          },
      {
        subName: "subject2",
            remark: ['remark1', 'Hockey']
          }
    ]
}

我想生成属性的笛卡尔积,以便输出为以下形式的数组:

[
   { "name": "name here",  "skills":  "cash",   "subjects": {  "subName":    "subject1", “remark”: “remark2” }},
   { "name": "name here",  "skills":  "cash",   "subjects": {  "subName":    "subject1", “remark”: “remark1”  }},
   { "name": "name here",  "skills":  "cash",   "subjects": {  "subName":    "subject2", “remark”: “remark1” }},
   { "name": "name here",  "skills":  "cash",   "subjects": {  "subName":    "subject2",  “remark”: “Hockey” }},
   { "name": "name here",  "skills":  "shares",  "subjects": {  "subName":  "subject1",  “remark”: “remark1” }},
   { "name": "name here",  "skills":  "shares",  "subjects": {  "subName":   "subject1",  “remark”: “remark2” }},
   { "name": "name here",  "skills":  "shares",  "subjects": {  "subName":  "subject2",  “remark”: “remark1”   }},
   { "name": "name here",  "skills":  "shares",  "subjects": {  "subName":  "subject2",  “remark”: “Hockey”  }}
]

我尝试了很多算法(在其他 SO 帖子中提到),甚至尝试自定义其中一些,但仍然没有太大改进。

如果能提供任何形式的帮助,我将不胜感激。 预先感谢您的帮助。

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

引用的 link 不起作用,因为给定的对象数组与链接的答案不相关。

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;
    }, [{}]);
}

var data = { name: "name here", skills: ["cash", "shares"], subjects: [{ subName: "subject1", remark: ['remark1', 'remark2'] }, { subName: "subject2", remark: ['remark1', 'Hockey'] }] };

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