我正在做一项作业。 我有以下对象形式。
{
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/