我想從一個物件中轉換物件的組合。例如:
例子:
var obj1 = {city: "Canada", pincode: [300005, 300006, 300007], locations: ["Toronto", "Winnipeg", "Montreal"]};
預期輸出為:
result = [{city: "Canada", pincode: 300005, location: "Toronto"}, {city: "Canada", pincode: 300005, location: "Winnipeg"}, {city: "Canada", pincode: 300005, location: "Montreal"}, {city: "Canada", pincode: 300006, location: "Toronto"}, {city: "Canada", pincode: 300006, location: "Winnipeg"}, {city: "Canada", pincode: 300006, location: "Montreal"},{city: "Canada", pincode: 300007, location: "Toronto"}, {city: "Canada", pincode: 300007, location: "Winnipeg"}, {city: "Canada", pincode: 300007, location: "Montreal"}]
uj5u.com熱心網友回復:
試試這個 -> 通過密碼和位置映射并回傳每個密碼和位置所需的物件。
var obj1 = { city: "Canada", pincode: [300005, 300006, 300007], locations: ["Toronto", "Winnipeg", "Montreal"] };
//map through the pincodes and locations
const resultArray = obj1.pincode.map((pincode) => {
return obj1.locations.map((location, index) => {
return { city: obj1.city, pincode: pincode, location: obj1.locations[index] }
})
});
//flatten the result array
[].concat.apply([], resultArray);
uj5u.com熱心網友回復:
const result = [];
var obj1 = {city: "Canada", pincode: [300005, 300006, 300007], locations: ["Toronto", "Winnipeg", "Montreal"]};
obj1.pincode.map((val, idx) => {
result.push({
city: obj1.city,
pincode: val,
locations: obj1.locations[idx]
})
});
uj5u.com熱心網友回復:
這是一個通用解決方案,它假定所有陣列型別的屬性都將分解為陣列元素,當在給定物件中找到多個陣列時,會產生笛卡爾積。
它重用了陣列的笛卡爾積的代碼,并定義了更多的輔助函式:
toArray如果引數還不是一個陣列,則將其包裝到一個陣列中,否則就按原樣回傳引數。這用于具有給定物件中所有屬性值的陣列版本,并且這些陣列被傳遞以獲取笛卡爾積zip將兩個大小相等的陣列合并為一對陣列。這由以下人員使用combine:combine將一組鍵和一組值合并到一個物件中。這些值是從笛卡爾積中回傳的值。
const cartesian =
data => data.reduce((a, b) => a.flatMap(x => b.map(y => [...x, y])), [[]]);
const toArray = a => [].concat(a);
const zip = (a, b) => a.map((v, i) => [v, b[i]]);
const combine = (keys, values) => Object.fromEntries(zip(keys, values));
// The main algorithm:
const expand = obj =>
cartesian(Object.values(obj).map(toArray)).map(combine.bind(null, Object.keys(obj)));
// Example
const obj1 = {
city: "Canada",
pincode: [300005, 300006, 300007],
locations: ["Toronto", "Winnipeg", "Montreal"]
}
const result = expand(obj1);
console.log(result);
所以執行的步驟是:
- 從給定物件中獲取值
- 如果它們還沒有,則將它們設為陣列,因此“Canada”變為 [“Canada”]
- 在這些陣列上執行笛卡爾積
- 將該產品中的每個組合與原始物件的鍵合并,以將該組合變成一個物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513473.html
上一篇:遍歷嵌套的Python字典?
