Преобразование строкового массива в объект с тем же ключом/значением

#javascript #typescript #lodash

Вопрос:

Как мне преобразовать ["one","two","three"] в {one:"one", two:"two", three:"three"}

 import stringArray from './a.js';

class b {
 hashmap = stringArray// convert this into Object here inline.
}
 

Прежде чем вы прыгнете, я знаю, как этого добиться, скажем, в конструкторе() с помощью таких трюков, как forEach, for в цикле и т. Д. Существует ли простой однострочный код для достижения этой цели в свойстве класса, а не внутри функции.

Комментарии:

1. stringArray.reduce((a, c) => (a[c] = c, a), {})

2. Вы также можете использовать IIFE , например: hashmap = (() => {.. return "something"})()

Ответ №1:

 data = ["one","two","three"];
data = data.map(e => [e,e]) // keyvalue pairs [["one","one"],["two","two"],["three","three"]]
data = Object.fromEntries(data); // {"one":"one","two":"two","three":"three"}
 

map преобразует каждый элемент вашего входного массива в нужную вам структуру.

В этом случае мы хотим преобразовать каждый элемент в массив, в котором элемент повторяется дважды

Object.froEntries преобразует список пары ключ-значение в Object

Это также можно сделать с помощью простого старого цикла for

 data = ["one","two","three"];
obj = {};
for(let i = 0; i < data.length ; i  ){
   obj[data[i]] = data[i];
}

 

Ответ №2:

Попробуй это:

 const arr = ["one","two","three"]
let obj = {}
arr.forEach(item => {obj[item] = item})
document.write(JSON.stringify(obj)) 

Ответ №3:

Lodash

Вы можете использовать _.zipObject . Он принимает два массива — один для ключей, другой для значений, но если вы просто используете один и тот же массив дважды, вы получите совпадающие пары:

 const arr = ["one","two","three"];

const obj = _.zipObject(arr, arr);
console.log(obj); 
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script> 

Простой JavaScript

Вы можете использовать Object.fromEntries для того же самого. Он работает с массивом пар ключ-значение, поэтому вам придется преобразовать свой в этот:

 const arr = ["one","two","three"];

const matchingKeyValuePairs = arr.map(x => [x, x]);

const obj = Object.fromEntries(matchingKeyValuePairs);
console.log(obj); 

Также вы можете использовать Array#reduce для создания объекта с вычисляемым именем свойства:

 const arr = ["one","two","three"];

const obj = arr.reduce((acc, item) => ({...acc, [item]: item}), {});
console.log(obj); 

Комментарии:

1. Я пытаюсь сделать это в объявлении члена класса, поэтому многострочный код не будет работать. Но я соглашусь с вашим ответом, если вы его измените

2. Что ты имеешь в виду? Вы хотите добавить массив в качестве свойств к текущему экземпляру?

3. класс b { hashmap = _.zipObject(arr, arr); }

4. Почему имеет значение, к чему вы относитесь? Вы заинтересованы в правильности данных — независимо от того, создаете ли вы переменную, свойство объекта или что-то еще, результат один и тот же

5. В данном случае это не так, но так будет с другими случаями многострочного кода.

Ответ №4:

У Lodash есть _.keyBy() функция, которая создает объект из массива, генерируя ключи из значений с помощью предоставленной функции (итерация). По умолчанию используется _.identity() итерация , которая возвращает значение.

 const arr = ["one","two","three"];

const obj = _.keyBy(arr);

console.log(obj); 
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>