JS(如​​果存在键),包括到数组

时间:2019-03-21 16:06:55

标签: javascript dictionary transform

我被困在将对象映射到数组。 我使用map,但是它在数组中添加了每个对象字段,所以我有很多不确定的地方。

  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 个答案:

答案 0 :(得分:2)

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
}, []);

单线解决方案:

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

答案 1 :(得分:1)

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)