JS, если ключ существует, включить в массив

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