#javascript #dictionary #transform
#javascript #словарь #преобразовать
Вопрос:
Я застрял в сопоставлении объекта с массивом. Я использую map, но он добавляет каждое поле объекта в массив, и я получаю много неопределенных.
const mapKey: { [key: string]: number } = {
'hello': 3,
};
preferences = {
hello: true,
.....
.....
}
const array = Object.entries(preferences).map(([key, value]) => {
return mapKey[key] amp;amp; { index: mapKey[key], visible: true };
});
результат:
[undefined, undefined....{ index: mapKey[key], visible: true }]
but i need just [{ index: mapKey[key], visible: true }]
Ответ №1:
Array#map
Метод генерирует массив на основе возвращаемого значения, он не подходит для требований, поэтому используйте Array#reduce
метод.
const array = Object.entries(preferences).reduce((arr, [key, value]) => {
// push into the array only if defined
columnIndexMap[key] amp;amp; arr.push({ index: mapKey[key], visible: true });
// return the array reference for next iteration
return arr;
// set initial value as empty array for the result
}, []);
Однострочное решение:
const array = Object.entries(preferences).reduce((arr, [key, value]) => (columnIndexMap[key] amp;amp; arr.push({ index: mapKey[key], visible: true }), arr), []);
Ответ №2:
Ответ с reduce
, конечно, работает и эффективен. Вы также можете использовать filter()
map
. Недостатком этого является то, что значения просматриваются дважды, но имеет преимущество в удобочитаемости. Что более важно, конечно, зависит от вашего варианта использования. Я бы предпочел следующее, если только данных не так много, что дополнительная работа заметна:
const mapKey = { 'hello': 3, 'test':4, 'test2': 5};
let preferences = { hello: true, test:false, test2:true}
let filtered = Object.entries(preferences)
.filter(([k, visible]) => visible)
.map(([k, visible]) => ({ index: mapKey[k], visible }))
console.log(filtered)