I have a data structure like
const dd = [{
keyone: "test",
two: "you",
three: 'op',
}, {
keyone: "youuuu",
two: "ttt",
three: 'op',
}, {
keyone: "operation",
two: "test",
three: 'op',
}];
And I am wanting to be able to pull out keyone and two into an object like the following
const obj = { keyone: ['test', 'youuuu', 'operation'], two: ['you', 'ttt', 'test']}
I've achieved this using two maps and combining them but I would like to use only one loop if possible.
EDIT:
I am currently using destructuring to extract values:
const mapOne = dd.map(({ keyone }) => keyone);
const mapTwo = dd.map(({ two }) => two);
const test = {
keyone: mapOne,
two: mapTwo,
};
You could take an array of keys and group the values together.
const
data = [{ keyone: "test", two: "you", three: 'op' }, { keyone: "youuuu", two: "ttt", three: 'op' }, { keyone: "operation", two: "test", three: 'op' }],
keys = ['keyone', 'two'],
grouped = data.reduce((r, o) => {
keys.forEach(k => (r[k] ??= []).push(o[k]));
return r;
}, {});
console.log(grouped);
A generically implemented, thus re-usable and configurable function, which does exactly what the OP did ask for, would be close to the next provided example code ...
function groupAndCollectSpecifcEntriesOnly(collector, item) {
const { keyList, result } = collector;
keyList.forEach(key => {
if (item.hasOwnProperty(key)) {
(result[key] ??= []).push(item[key])
}
});
return collector;
}
const sampleData = [{
keyone: "test",
two: "you",
three: 'op',
}, {
keyone: "youuuu",
two: "ttt",
three: 'op',
}, {
keyone: "operation",
two: "test",
three: 'op',
}];
console.log(
sampleData.reduce(groupAndCollectSpecifcEntriesOnly, {
keyList: ['keyone', 'two'],
result: {},
}).result
);
console.log(
sampleData.reduce(groupAndCollectSpecifcEntriesOnly, {
keyList: ['three', 'keyone'],
result: {},
}).result
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
You can do something like this:
const dd = [
{
keyone: "test",
two: "you",
three: 'op'
},
{
keyone: "youuuu",
two: "ttt",
three: 'op'
},
{
keyone: "operation",
two: "test",
three: 'op'
}];
const result = dd.reduce((prev, acc, arr ) => {
if (acc['keyone']) { prev['keyone'].push(acc['keyone']) }
if (acc['two']) { prev['two'].push(acc['two']) }
return prev;
}, {keyone: [], two: []});
console.log(result);