JS, если ключ существует, включить в массив - PullRequest
0 голосов
/ 21 марта 2019

Я застрял в отображении объекта в массив.Я использую карту, но она добавляет каждое поле объекта в массив, и я получил много неопределенных.

  const mapKey: { [key: string]: number } = {
	  'hello': 3,
	};


	preferences = {
		hello: true,
		.....
		.....
	}

    const array = Object.entries(preferences).map(([key, value]) => {
      return mapKey[key] && { index: mapKey[key], visible: true };
    });
	

результат:

[undefined, undefined....{ index: mapKey[key], visible: true }]
	
	but i need just [{ index: mapKey[key], visible: true }]

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Метод Array#map генерирует массив на основе возвращаемого значения, он не подходит для требований, поэтому используйте метод Array#reduce.

const array = Object.entries(preferences).reduce((arr, [key, value]) => {
   // push into the array only if defined
   columnIndexMap[key] && 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
}, []);

Oneрешение:

const array = Object.entries(preferences).reduce((arr, [key, value]) => (columnIndexMap[key] && arr.push({ index: mapKey[key], visible: true }), arr), []);
1 голос
/ 21 марта 2019

Ответ с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...