簡體   English   中英

如何將鍵數組和值數組合並到一個對象中?

[英]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"];

而我能夠分配ba使用與循環:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM