javascript - JavaScript 对象与不同类型值(如字符串、对象和数组)的笛卡尔积

标签 javascript arrays javascript-objects cartesian-product

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

{
    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 并构建新对象,您可以采用递归函数来分隔所有键/值对,并通过迭代值构建新的笛卡尔积。

引用的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; }

关于javascript - JavaScript 对象与不同类型值(如字符串、对象和数组)的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460039/

相关文章:

php - 在 MySQL 查询中使用数组结果

javascript - 如何记录仅具有原始值的对象?

javascript - 如何将多个数组的结构更改为数组对象 Node.js?

javascript - 我如何在 jQuery 中定义我自己的事件?

javascript - Jquery 问题 : How can I break up a multi-part form so that only one fieldset is visible at a time?

javascript - 如何在 javascript(无 jquery)中查询数据属性值?

javascript - 如何使用 JavaScript 删除 URL 中的第一个斜杠

arrays - Swift - 将 plist 文件读取到数组?

java - 在数组或 EnumSet 中从枚举类获取多个对象的方法

javascript - 是否有任何对象属性可以提取javascript中的嵌套键?