Массив объектов с парами ключ / значение из заданных массивов ключей и значений

1

Я пытаюсь вернуть массив пар ключ-значение: [{"a": 1},{"b": 2},{"c": 3}] из заданного массива ключей: ["a", "b", "c"] и массив значений: [1, 2, 3]

Я пробовал это:

let arr = [], obj = {}, key, val;
const keyValuePairs = (k, v) => {
  if (k.length === v.length) {
    for (var i = 0; i < k.length; i++) {
      key = k[i]; val = v[i];
      arr[i] = {key: val};
    }
  } return arr;
};

keyValuePairs(["a", "b", "c"], [1, 2, 3]);

Но он возвращается - [ { key: 1 }, { key: 2 }, { key: 3 } ]

Как мне это сделать?

  • 0
    Попробуйте изменить arr[i] = {key: val}; to arr[i] = {[key]: val};
  • 1
    @Hasan Хасан - Большое спасибо. Оно работает.
Теги:
arrays

5 ответов

1
Лучший ответ

Если вы ориентируетесь на новый достаточно браузер или используете babel, есть новый синтаксис, который позволяет это легко:

arr[i] = {[key]: val};

В противном случае вам нужно будет использовать несколько строк для установки ключа

let arr = [], obj = {}, key, val;
const keyValuePairs = (k, v) => {
  if (k.length === v.length) {
    for (var i = 0; i < k.length; i++) {
      key = k[i]; val = v[i];
      var newObj = {};
      newObj[key] = val;
      arr[i] = newObj;
    }
  } return arr;
};

Просто общие комментарии к коду: у вас есть куча переменных из сферы действия функции. Это также довольно многословно. Вы можете написать всю функцию следующим образом:

const keyValuePairs = (k, v) => (
    k.map((key, index) => ({ [key]: v[index] }))
);
  • 0
    Если вы собираетесь обсуждать этот новый синтаксис, почему бы не дать его имя и даже ссылку?
  • 0
    Да, это довольно многословно. [key] является ключом здесь, хотя. Большое спасибо.
0

вы можете использовать метод уменьшения также согласно вашему требованию.

см. ниже пример..

let keys = ["a", "b", "c"], 
    values = [1, 2, 3],
    result = keys.reduce((r,v,i)=>r.concat({[v]:values[i]}),[]);

console.log(result);;
0

Попробуйте это (простое решение):

var answer = keyValuePairs(["a", "b", "c"], [1, 2, 3]);
console.log(answer);

function keyValuePairs(arrOne, arrTwo){
     var returnArr = [];
     for(var i = 0; i < arrOne.length; i++){
        var obj = {};
        obj[arrOne[i]] = arrTwo[i];
        returnArr[i] = obj;
     }
     
     return returnArr;
  
}
0

используя lodash, вы можете сделать это в одной строке с помощью _.map или vanilla Array.prototype.map и использовать индекс i для Array.prototype.map массивов.

var keys = 'abc'.split('');
var values = '123'.split('');
var result = _.map(keys, (key, i) =>  ( { [keys[i]] : values[i] } ) );
console.log(JSON.stringify(result));

дает: [{"a":"1"},{"b":"2"},{"c":"3"}]

вы также можете продолжить этот шаблон по размеру:

var keys = 'abc'.split('');
var values = '123'.split('');
var valuesValues = 'xyz'.split('');
var result = _.map(keys, (key, i) => ( { [keys[i]] : { [ values[i] ]: valuesValues[i] } } ) );
console.log(JSON.stringify(result));

дает: [{"a":{"1":"x"}},{"b":{"2":"y"}},{"c":{"3":"z"}}]

0

a = ["a", "b", "c"], b = [1, 2, 3]

c = a.map((k, i) => ({[k]: b[i]}))

console.log(JSON.stringify(c))

Как сделать zip двумя массивами в JavaScript?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню