Изменения значений в объекте JS

Застрял на одной задачке, не могу понять, что делаю не так. Нужно было написать функцию, которая принимает объект как аргумент и возвращает новый объект. Только с полями, у которых тип значения - строка. Основным условием было решение через reduce.

Пример: Input: { name: 'pilot', isActive: true };
Actions:
Output: { name: 'pilot' }

Написал вот такой код, но не знаю, как именно его изменить...

function test(param) {
  const keys = Object.keys(param)
  return Object.entries(param)
    .filter((item) => typeof item[1] === `string`)
    .reduce((acc, item, index) => {
      return {
        ...acc,
        [keys[index]]: item
      }
    }, {})
}


Ответы (2 шт):

Автор решения: Михаил В

Object.entries - возвращает двухуровневый массив, где первый элемент - ключ, второй - значение. На каждом этапе reduce проверяем, что второй элемент имеет тип string. Если это так, добавляем в копию нового объекта наш элемент, если нет - просто возвращаем текущую копию

Что-то в этом роде получается

let obj =  { name: 'pilot', isActive: true };

const res = Object.entries(obj)
.reduce((acc, item)=>{
if(typeof item[1] === 'string'){
    return { ...acc, [ item[0] ] : item[1] };
}
return acc;
}, {});

console.log(res);

→ Ссылка
Автор решения: Neverm1ndo

Создавать переменную keys с ключами объекта совсем не обязательно; все ключи будут получены из вывода Object.entries().

var obj = {
  1: 'value',
  2: true,
};

Object.entries(obj) // [ [1, 'value'], [2, true] ]

Метод Array.filter уберет из многомерного массива все элементы(массивы [ключ, значение]), где тип значения string. Это лишниий проход по массиву в цикле.

Object.entries(param)
      .filter((item) => typeof item[1] === `string`); // лишний цикл, проверку можно выполнить в reduce

Ваш код должен выглядеть примерно так:

const obj = { 
  name: 'pilot',
  surname: 'auto',
  1: null,
  2: 20,
  isActive: true 
};

function test(param) {
  return Object.entries(param)
               .reduce((acc, [key, value]) => { // деструктурируем аргумент с текущим элементом 
                  if (typeof value == 'string') acc[key] = value; // если значение типа string добавляем свойство в объект аккумулятор 
                  return acc;
                }, {});
}

console.log(test(obj));

→ Ссылка