#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>