首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同类型值的javascript对象的笛卡儿积,例如字符串、对象和数组

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

Stack Overflow用户
提问于 2018-07-21 20:54:30
回答 1查看 483关注 0票数 1

我正在做一项任务。我有以下的对象形式。

代码语言:javascript
复制
{
    name: "name here",
    skills:  [ "cash", "shares" ],
    subjects: 
    [ 
      {
        subName: "subject1",
            remark: ['remark1', 'remark2']
          },
      {
        subName: "subject2",
            remark: ['remark1', 'Hockey']
          }
    ]
}

我希望生成属性的笛卡儿积,以便输出是以下形式的数组:

代码语言:javascript
复制
[
   { "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帖子中提到),甚至尝试定制其中的一些算法,但仍然没有多大改进。

我真的很想在这方面提供任何帮助。提前谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-22 07:24:07

如果带有对象的数组再次调用getCartesian并构建新的对象,则可以使用一个递归函数来分离所有键/值对,并通过迭代这些值构建一个新的笛卡儿积。

引用的link不工作,因为给定的对象数组链接答案不尊重。

代码语言:javascript
复制
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));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51460039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档