I have an object that contains other objects, as well as a few numbers i don't want.
I want to convert the object into an array of objects and remove the numbers.
an example:
INPUT
const object = {
john: {
instrument: 'violin',
age: 26
},
bob: {
instrument: 'guitar',
age: 32
},
numberIDontWant: 2,
flynn: {
instrument: 'piano',
age: 3
},
numberIDontWant2: 9
}
OUTPUT
[
{
name: 'john',
instrument: 'violin',
age: 26
},
{
name: 'bob',
instrument: 'guitar',
age: 32
},
{
name: 'flynn',
instrument: 'piano',
age: 20
}
]
Can anyone help me with that?
CodePudding user response:
You could use Object.entries
and .map
:
console.log(Object.entries({
john: {
instrument: 'violin',
age: 26
},
bob: {
instrument: 'guitar',
age: 32
},
numberIDontWant: 2,
flynn: {
instrument: 'piano',
age: 3
},
numberIDontWant2: 9
}).map(([k,v]) => typeof v === 'object' ? ({...v, name: k}) : undefined).filter(i => i))
CodePudding user response:
You'll most likely want to iterate over the Object.entries()
so you have access to the key (the name
) and the value. It isn't 100% clear what the criteria is for what values to include/exclude, but one way would be to only include the values that have a typeof
equal to 'object'
.
function objectToArray(obj) {
let arr = [];
for (let [name, value] of Object.entries(obj)) {
if (typeof value === "object") {
arr.push({
...value,
name,
});
}
}
return arr;
}
console.log(
objectToArray({
john: {
instrument: "violin",
age: 26,
},
bob: {
instrument: "guitar",
age: 32,
},
numberIDontWant: 2,
flynn: {
instrument: "piano",
age: 3,
},
numberIDontWant2: 9,
})
);
CodePudding user response:
You could use map
and filter
const data = {
john: {
instrument: 'violin',
age: 26
},
bob: {
instrument: 'guitar',
age: 32
},
numberIDontWant: 2,
flynn: {
instrument: 'piano',
age: 3
},
numberIDontWant2: 9
}
const result = Object.entries(data).map(([k, v]) => {
if (typeof v === "object") return { ...v, name: k }
}).filter(x => x);
console.log(result);
CodePudding user response:
const array = []
for (const [key, value] of Object.entries(object)) {
if (typeof value === 'object' && value != null) {
array.push({
name: key,
instrument: value.instrument,
age: value.age
})
}
}
CodePudding user response:
I would do it like this:
const object = {
john: {
instrument: 'violin',
age: 26
},
bob: {
instrument: 'guitar',
age: 32
},
numberIDontWant: 2,
flynn: {
instrument: 'piano',
age: 3
},
numberIDontWant2: 9
}
const result = [];
for (const i of Object.entries(object)) {
if (typeof i[1] == 'object') {
const obj = { name: i[0], ...i[1] }
result.push(obj)
}
}
console.log(result);
CodePudding user response:
const object = {
john: {
instrument: "violin",
age: 26,
},
bob: {
instrument: "guitar",
age: 32,
},
numberIDontWant: 2,
flynn: {
instrument: "piano",
age: 3,
},
numberIDontWant2: 9,
};
const arr = [];
for (let [key, value] of Object.entries(object)) {
if (
typeof value === "object" &&
value.hasOwnProperty("instrument") &&
value.hasOwnProperty("age")
)
arr.push({
name: key,
...value,
});
}
console.log(arr);
CodePudding user response:
- Use Object.entries to create an entries (key/value pairs) array from your Object
- Use Array.prototype.reduce to reduce one array to another
- Use typeof operator to check the type is an object while reducing
const object = {
john: {instrument: 'violin', age: 26},
bob: {instrument: 'guitar', age: 32},
numberIDontWant: 2,
flynn: {instrument: 'piano', age: 3},
numberIDontWant2: 9
};
const result = Object.entries(object).reduce((arr, [k, v]) =>
(typeof v === "object" && arr.push({...v, name:k}), arr)
, []);
console.log(result);
CodePudding user response:
flatMap
can be used to filter and map in one go, saving the need to call reduce
.
I would use it like this:
const convert = (o) =>
Object.entries(o).flatMap(([name, val]) => typeof val == 'object' ? [{name, ...val}] : [])
const object = {john: {instrument: 'violin', age: 26}, bob: {instrument: 'guitar', age: 32}, numberIDontWant: 2, flynn: {instrument: 'piano', age: 3}, numberIDontWant2: 9}
console.log(convert(object))
.as-console-wrapper {max-height: 100% !important; top: 0}