我正在做一项任务。我有以下的对象形式。
{
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帖子中提到),甚至尝试定制其中的一些算法,但仍然没有多大改进。
我真的很想在这方面提供任何帮助。提前谢谢你的帮助。
发布于 2018-07-22 07:24:07
如果带有对象的数组再次调用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; }
https://stackoverflow.com/questions/51460039
复制相似问题