我正在编写一个编码练习,我的目标是在NodeJS中编写一个名为Object
的函数,该函数以单个Object
作为参数。使用该对象中的所有Array
属性,生成一个JS对象数组:
Object
参数中的属性不是数组,则应将其视为包含单个值的数组。{
pilot: ["Han Solo", "Lando Calrissian"],
copilot: ["Chewbacca", "Rey"],
ship: "Falcon",
speed: "1.5c"
}
在本例中,该函数应该产生以下排列:
[
{
"pilot": "Han Solo",
"copilot": "Chewbacca",
"ship": "Falcon",
"speed": "1.5c"
},
{
"pilot": "Han Solo",
"copilot": "Rey",
"ship": "Falcon",
"speed": "1.5c"
},
{
"pilot": "Lando Calrissian",
"copilot": "Chewbacca",
"ship": "Falcon",
"speed": "1.5c"
},
{
"pilot": "Lando Calrissian",
"copilot": "Rey",
"ship": "Falcon",
"speed": "1.5c"
}
]
我一直在关注这个问题:How can I create all combinations of this object's keys/values in JavaScript?,但我不能完全理解,因为我只能传递一个参数。
我对此感到迷茫,任何指点都将不胜感激!
发布于 2021-06-19 15:27:33
如果带有对象的数组再次调用getCartesian
并构建新的对象,则可以使用一个递归函数来分离所有键/值对,并通过迭代这些值构建一个新的笛卡儿积。
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 = { pilot: ["Han Solo", "Lando Calrissian"], copilot: ["Chewbacca", "Rey"], ship: "Falcon", speed: "1.5c" };
console.log(getCartesian(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2021-06-19 17:06:29
这是我的解决方案的版本,结果没有相同的顺序,但是数据是100%被置换的。
let data = {
pilot: ["Han Solo", "Lando Calrissian"],
copilot: ["Chewbacca", "Rey"],
ship: "Falcon",
speed: "1.5c"
};
let newData = new Array();
let currentData = {};
let saveProperty = new Array();
for(let index = 0;index < data.pilot.length; index++){
for(let property in data){
if(Array.isArray(data[property])){
if(saveProperty.findIndex(function(e){
if(e == property){
return true;
}
}) == -1){
saveProperty.push(property);
}
currentData[property] = data[property][index];
}else{
currentData[property] = data[property];
}
}
//newData.push(currentData);
for(let pr of saveProperty){
data[pr].forEach(function(e, i){
let copy = {};
Object.assign(copy,currentData);
copy[pr] = data[pr][i];
if(newData.findIndex(function(e){
let counter = 0;
for(let en in copy){
if(copy[en] == e[en]){
counter++;
}
}
if(counter == Object.keys(copy).length){
return true;
}
}) == -1){
newData.push(copy);
}
});
}
saveProperty = new Array();
currentData = {};
}
console.log(newData);
https://stackoverflow.com/questions/68048091
复制相似问题