Просто для того, чтобы поделиться другим подходом (возможно, достаточно элегантно), вот решение, полагающееся на генераторы функций для рекурсивного выравнивания объекта.
Поскольку оно опирается на генераторы функций, вы можете в конечном итоге построить объект динамическии пропустить нежелательные ключи из-за того, что результат является итеративным.
Приведенный ниже пример намеренно сделан немного более сложным для обработки массивов и null
значений, хотя и не требуется в исходном вопросе.
const original = {
temperature: null,
humidity: null,
pressure: null,
windspeed: null,
arrayKey: [1,2,3,'star!'],
fnKey: function(i) {
return i * 3;
},
pollution: {
PM1: 1,
PM10: 2,
PM25: 3
}
};
// Flattens an object.
function* flattenObject(obj, flattenArray = false) {
// Loop each key -> value pair entry in the provided object.
for (const [key, value] of Object.entries(obj)) {
// If the target value is an object and it's not null (because typeof null is 'object'), procede.
if (typeof(value) === 'object' && value !== null) {
// if the targeted value is an array and arrays should be flattened, flatten the array.
if (Array.isArray(value) && flattenArray) yield* flattenObject(value);
// Otherwise, if the value is not an array, flatten it (it must be an object-like or object type).
else if (!Array.isArray(value)) yield* flattenObject(value);
// otherwise, just yield the key->value pair.
else yield [key, value];
}
// otherwise, the value must be something which is not an object, hence, just yield it.
else yield [key, value];
}
}
// usage: assign to a new object all the flattened properties, using the spread operator (...) to assign the values progressively.
const res = Object.fromEntries(flattenObject(original));
console.log(res);
// sample usage by flattening arrays as well.
const res_flattened_arrays = Object.fromEntries(flattenObject(original, true));
console.log(res_flattened_arrays);
// custom object building by skipping a desired key
const resWithoutTemperature = {};
for (const [key, value] of flattenObject(original)) {
if (key !== 'temperature') resWithoutTemperature[key] = value;
}
console.log(resWithoutTemperature);