[英]How to merge array of keys and arrays of values into an object?
我有以下數組:
var a = ["F", "M"];
var b = ["female", "male"];
var c = ["fa-female", "fa-male"];
而我能夠分配b
到a
使用與循環:
ans[a[i]] = values[i]; // { M: "male", F: "female" }
我將如何添加第三個數組並將其分配給a
?
{ M: {"male", "fa-male"}, F: {"female", "fa-female"} }
或類似的東西?
編輯:結果可以是數組或對象。
使用Object.fromEntries()
,您可以通過將( .map()
)每個key
(即:值)從a
映射到來自所有其他數組的相同索引的值數組來構建[key, value]
對數組:
const a = ["F", "M"]; const b = ["female", "male"]; const c = ["fa-female", "fa-male"]; const buildObj = (keys, ...values) => Object.fromEntries(keys.map( (key, i) => [key, values.map(arr => arr[i])] )); const res = buildObj(a, b, c); console.log(res);
Object.fromEntries()
具有有限的瀏覽器支持,但是,它可以很容易地被 polyfill。 或者,您可以使用Map
代替使用對象,這將消除.fromEntries()
的需要:
const a = ["F", "M"]; const b = ["female", "male"]; const c = ["fa-female", "fa-male"]; const buildMap = (keys, ...values) => new Map(keys.map( (key, i) => [key, values.map(arr => arr[i])] )); const res = buildMap(a, b, c); console.log("See browser console:", res); // see browser console for output
您可以組合數組以形成Object.fromEntries
鍵/值對:
Object.fromEntries([['M', 'male'], ['F', 'female']]);
//=> {M: 'male', F: 'female'}
但是Object.fromEntries
不處理碰撞:
Object.fromEntries([['M', 'male'], ['F', 'female'], ['F', 'fa-female']]);
//=> {M: 'male', F: 'fa-female'}
如您所見, F
的先前值剛剛被覆蓋:/
我們可以構建一個自定義的fromEntries
函數,將值放入數組中:
const fromEntries =
pairs =>
pairs.reduce((obj, [k, v]) => ({
...obj,
[k]: k in obj
? [].concat(obj[k], v)
: [v]
}), {});
fromEntries([['M', 'male'], ['M', 'fa-male'], ['F', 'female'], ['F', 'fa-female']]);
//=> {M: ["male", "fa-male"], F: ["female", "fa-female"]}
那么如何創建鍵/值對呢?
一種可能的解決方案: zip
const zip = (x, y) => x.map((v, i) => [v, y[i]]);
zip(['F', 'M'], ['female', 'male']);
//=> [["F", "female"], ["M", "male"]]
所以要產生所有對(和你的最終對象)
fromEntries([
...zip(['F', 'M'], ['female', 'male']),
...zip(['F', 'M'], ['fa-female', 'fa-male'])
]);
用這個。
var a = ["F", "M"];
var b = ["female", "male"];
var c = ["fa-female", "fa-male"];
var resultArray = [];
for(var i = 0; i < a.length; i++) {
resultArray [a[i]] = [b[i], c[i]];
}
var a = ["male","female"];
var b = ["m","f"];
var c = ["fa male","fa female"];
var result = a.reduce((res,val,key) => {
var temp = [b,c];
res[val] = temp.map((v) => v[key]);
return res;
},{});
這個有點貴。 它是一個嵌套循環。
這是與forEach
一行。 另一種使用reduce和Map的方法。
var a = ["F", "M"]; var b = ["female", "male"]; var c = ["fa-female", "fa-male"]; const ans = {}; a.forEach((key, i) => (ans[key] = [b[i], c[i]])); console.log(ans) // Alternate way var ans2 = Object.fromEntries( a.reduce((acc, curr, i) => acc.set(curr, [b[i], c[i]]), new Map()) ); console.log(ans2);
使用地圖和過濾器的解決方案
var a = ["M", "F"];
var b = ["female", "male"];
var c = ["fa-female", "fa-male"];
const bAndC = b.concat(c);
let returnObj = {};
a.map(category => {
let catArray = []
if(category === 'F') {
catArray = bAndC.filter(item => item.includes('female'));
} else {
catArray = bAndC.filter(item => item.includes('male') && !item.includes('female'));
}
return returnObj[category] = catArray;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.