Skip to content

Instantly share code, notes, and snippets.

@Woodsphreaker
Last active March 30, 2017 01:05
Show Gist options
  • Save Woodsphreaker/a47f9afce5897127921397a784ad26b7 to your computer and use it in GitHub Desktop.
Save Woodsphreaker/a47f9afce5897127921397a784ad26b7 to your computer and use it in GitHub Desktop.

Recuperar todos os valores do objeto

Tive uma situação em que precisei recuperar todos os valores de um objeto, mas esse objeto tinha vários níveis.

O que fiz então foi, criar uma recursividade, verificando cada nó do objeto, se o nó fosse o tipo Object, como quase tudo no JS é, a função é novamente chamada entrando em um loop até que todos os nós fossem processados e seus valores armazenados.

O reduce permite um valor inicial, então usando o concat e o valor inicial como um array vazio foi possível armazenar e retornar todos os valores do objeto.

Acho que pode ser útil.

const object = {
"attr1": 1,
"attr2": 2,
"attr3": [
3, 4, 5, [6, 7, 8, [10, 11, [12, 13, 14]]]
],
"attr4": [{
"subattr4.1": [15, 16, 17, [18, 19, [20]]]
}],
"attr5": [{
"subattr5.1": [21, 22, [23, 24], 25, [26, [27, 28], 29, [30]]]
}],
"attr6": "valor1",
"attr7": [{
"attr7.1": "valor2",
"attr7.2": [{
"attr7.2.1": "valor3",
"attr7.2.2": [{
"attr7.2.2.1": "valor4",
"attr7.2.2.2": { "attr7.2.2.2.1": "valor5", "attr7.2.2.2.2": "valor6" }
}]
}]
}]
};
const isObject = (obj) => obj instanceof Object;
const objectValues = (obj) => Object.values(obj);
const flattenObj = (obj) => objectValues(obj).reduce((pre, pos) => pre.concat(isObject(pos) ? flattenObj(pos) : pos), [])
console.log(flattenObj(object)); // [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, "valor1", "valor2", "valor3", "valor4", "valor5", "valor6"]
@suissa
Copy link

suissa commented Mar 30, 2017

Renomeei algumas coisas, acho q assim fica mais claro e tb

const object = {

    "attr1": 1,
    "attr2": 2,
    "attr3": [
        3, 4, 5, [6, 7, 8, [10, 11, [12, 13, 14]]]
    ],
    "attr4": [{
        "subattr4.1": [15, 16, 17, [18, 19, [20]]]
    }],
    "attr5": [{
        "subattr5.1": [21, 22, [23, 24], 25, [26, [27, 28], 29, [30]]]
    }],
    "attr6": "valor1",
    "attr7": [{
        "attr7.1": "valor2",
        "attr7.2": [{
            "attr7.2.1": "valor3",
            "attr7.2.2": [{
                "attr7.2.2.1": "valor4",
                "attr7.2.2.2": { "attr7.2.2.2.1": "valor5", "attr7.2.2.2.2": "valor6" }
            }]
        }]
    }]
}
const ArraytoFlatten = ( obj ) => obj.reduce( (a, b) => a.concat(b) )
const isObject = ( obj ) => obj instanceof Object
const getObjectValues = ( obj ) => Object.values( obj )
const toFlattenArray = ( pre, pos ) => pre.concat( isObject( pos ) ? flatten( pos ) : pos)
const flatten = ( obj ) => 
    ( isObject( obj ) )
        ? getObjectValues( obj ).reduce( toFlattenArray, [])
        : ArraytoFlatten( obj )

console.log( `Array: `flatten( [1, 2, [3, 4, [5]]]) ) 
console.log( `Object: `flatten( object ) ) 
// [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, "valor1", "valor2", "valor3", "valor4", "valor5", "valor6"]

@suissa
Copy link

suissa commented Mar 30, 2017

Ja adicionei a feature p/ array tb!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment