Преобразовать массив пар «ключ-значение» в объект, используя javascript - PullRequest
3 голосов
/ 09 марта 2020

У меня есть массив пар ключей и значений как

let array = [
  "Social Network: 1",
  "Tasks: 1",
  "Calendar: 1",
  "Journal: 1",
  "Business Contact Manager: 2"
];

Я хочу преобразовать это в объект, как показано ниже:

{
  "Social Network": 1,
  "Tasks": 1,
  "Calendar": 1,
  "Journal": 1,
  "Business Contact Manager": 2
}

Как мне этого добиться?

Ответы [ 6 ]

4 голосов
/ 09 марта 2020

Вы можете использовать .reduce() и .split(), чтобы получить желаемый результат:

let array = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"];

let result = array.reduce((r, c) => {
  let [k, v] = c.split(":");
  r[k] = Number(v);
  return r;
}, {});

console.log(result);
3 голосов
/ 09 марта 2020

Вы можете создать действительный JSON и проанализировать его.

var data = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"];
    result = JSON.parse('{"' + data.join(',"').replace(/:\s/g, '":') + '}');
console.log(result);
1 голос
/ 09 марта 2020
let array = [
  "Social Network: 1",
  "Tasks: 1",
  "Calendar: 1",
  "Journal: 1",
  "Business Contact Manager: 2"
];

const desiredObj = array.reduce((acc, currentItem) => {
  let arr = currentItem.split(":");
  acc[arr[0]] = Number(arr[1]);
  return acc;
}, {});

console.log(desiredObj);
1 голос
/ 09 марта 2020

Вы можете .map() каждой строки разделить массив [key, value], где key - это часть слева от :, а value - это число справа от :. Затем вы можете использовать Object.fromEntries(), чтобы построить объект из ваших массивов пары ключ-значение:

const array = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"];

const res = Object.fromEntries(array.map(str => {
  const [a, b] = str.split(': ');
  return [a, +b];
}));
console.log(res);

В качестве альтернативы, если вы не можете поддерживать Object.fromEntries(), вы можете вместо этого использовать Object.assign(), сопоставляя объект и затем распространяя сопоставленные объекты в аргументы .assign():

const array = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"];

const res = Object.assign({}, ...array.map(str => {
  const [a, b] = str.split(': ');
  return {[a]: +b};
}));
console.log(res);
0 голосов
/ 09 марта 2020

Если производительность имеет значение, go с этим решением "classi c" for l oop. Это самое быстрое и довольно значительное решение (до 30%).

let array = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"];
let result = {};

for (let i = 0; i < array.length; i++) {
  let item = array[i];
  let pair = item.split(':');
  let key = pair[0];
  let value = parseFloat(pair[1]);
  result[key] = value;
}

console.log(result);
0 голосов
/ 09 марта 2020

Array#reduce идеально подходит для этого:

let arr = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"]

const result = arr.reduce((acc, c, _, __, [k, v] = c.split(': ')) => 
    (acc[k] = Number(v), acc), {})

console.log(result)

Или как насчет этого странного:

let arr = ["Social Network: 1", "Tasks: 1", "Calendar: 1", "Journal: 1", "Business Contact Manager: 2"]

const result = Object.assign(...arr.map((el) =>
    Object.fromEntries([el.split(': ').map((v, i) => i%2 ? Number(v) : v)])))

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...