перебор массива reduce
Я очень хочу разобраться с reduce, но опыта не хватает. Подскажите, пожалуйста, как можно переписать данный метод с его использованием?
let arr = [{
"otklplansnachalagoda202110": 454554,
"otklplantekuschmesyac202111": -76356,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
},
{
"otklplansnachalagoda202110": -188689,
"otklplantekuschmesyac202111": -172763,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
}]
const keys = Object.keys(arr[0])
arr = arr.map(elem => {
const f = {}
Object.values(elem).forEach((el, index) => { el !== null && el !== '' ? f[keys[index]] = el.toString() : f[keys[index]] = el})
return f
})
Задача состоит в том, чтобы все значения объектов преоразовать в строку, исключая нулевые значения и пустые строки и вернуть массив с исправленными значениями. Код выше - рабочий, просто хочется найти решение именно с reduce.
Ответы (2 шт):
Можно быстро перевести так и не заморачиваться
let arr = [{
"otklplansnachalagoda202110": 454554,
"otklplantekuschmesyac202111": -76356,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
},
{
"otklplansnachalagoda202110": -188689,
"otklplantekuschmesyac202111": -172763,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
}]
const keys = Object.keys(arr[0])
arr = arr.reduce((acc, elem) => {
const f = {};
Object.values(elem).forEach((el, index) => { el !== null && el !== '' ? f[keys[index]] = el.toString() : f[keys[index]] = el})
acc.push(f);
return acc;
}, [])
console.log(arr)
можно и по другому это сделать
let arr = [{
"otklplansnachalagoda202110": 454554,
"otklplantekuschmesyac202111": -76356,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
},
{
"otklplansnachalagoda202110": -188689,
"otklplantekuschmesyac202111": -172763,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
}]
function objectToString(obj) {
return Object.keys(obj).reduce((acc, item) => {
if (typeof obj[item] === 'object') {
acc[item] = objectToString(obj[item]);
} else {
acc[item] = obj[item] !== null? '' + obj[item]: obj[item];
}
return acc;
}, {});;
}
function arrayObjectToString(array) {
return array.reduce( (acc, item)=> {
acc.push(objectToString(item));
return acc;
} , []);
}
console.log(arrayObjectToString(arr))
Это не самая подходящая задача для освоения reduce. Тут просто нечего аккумулировать.
Поскольку вариант с reduce уже предложен, я просто приведу вариант решения вашей задачи без reduce и других методов:
let arr = [{
"otklplansnachalagoda202110": 454554,
"otklplantekuschmesyac202111": -76356,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": "Налоги",
},
{
"otklplansnachalagoda202110": -188689,
"otklplantekuschmesyac202111": -172763,
"vypolnplantekuschmesyac20216": 0,
"viddohoda4": null,
}
]
for (let obj of arr) {
for (let k in obj) {
if(obj[k] !== null) obj[k] = obj[k].toString();
}
}
console.log(arr);
UPD
Вижу не всем по вкусу такая наглость, поэтому double-reduce вариант:
let keys = Object.keys(arr[0]);
arr = arr.reduce((a, av) => (
a.push(
Object.values(av).reduce((o, ov, i) => (
o[keys[i]] = ov === null ? ov : '' + ov, o
), {})
), a
), []);
Теперь совесть чиста.