Изменения значений в объекте 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);
Создавать переменную 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));