Как объединить массив ключей и массивов значений в объект? - PullRequest
1 голос
/ 31 января 2020

У меня есть следующие массивы:

var a = ["F", "M"];
var b = ["female", "male"];
var c = ["fa-female", "fa-male"];

, и я могу назначить b на a, используя для l oop с:

ans[a[i]] = values[i]; // { M: "male", F: "female" }

как бы Я go о добавлении третьего массива и присвоении его также a?

{ M: {"male", "fa-male"}, F: {"female", "fa-female"} }

или что-то подобное?

РЕДАКТИРОВАТЬ: Результат может быть либо массив или объект.

Ответы [ 6 ]

4 голосов
/ 31 января 2020

Используя Object.fromEntries(), вы можете создать массив из [key, value] пар путем сопоставления (.map()) каждой key (ie: значение) из a в массив значений из того же индекса из всех других массивов:

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() имеет ограниченную поддержку браузера , однако его можно легко заполнить. В качестве альтернативы, вместо использования объекта, вы можете использовать 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
1 голос
/ 31 января 2020

Вы можете объединить массивы для формирования пар ключ / значение для 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'])
]);
0 голосов
/ 31 января 2020

Вот одна строка с forEach. Еще один способ, используя уменьшить и карту.

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);
0 голосов
/ 31 января 2020

Решение с использованием карты и фильтра

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;
});
0 голосов
/ 31 января 2020
   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;
   },{});

Это немного дороже. Это вложенное l oop.

0 голосов
/ 31 января 2020

используйте это.

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]];
}
...