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:
This is what i am currently using
const mapOne = dd.map(({ keyone }) => keyone)
const mapTwo = dd.map(({ two }) => two)
const test = {
keyone: mapOne,
two: mapTwo
}
CodePudding user response:
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; }
CodePudding user response:
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);
CodePudding user response:
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);
CodePudding user response:
You can do it by one iteration on your array using reduce and on every iteration, iterating over your object by Object.keys and forEach:
const data = [ { keyone: "test", two: "you", three: 'op' }, { keyone: "youuuu", two: "ttt", three: 'op' }, { keyone: "operation", two: "test", three: 'op' }];
const targetKeys = ['keyone', 'two']
const result = data.reduce((acc, obj)=> {
targetKeys.forEach(k => { (acc[k] = acc[k] || []).push(obj[k]) });
return acc;
}, {});
console.log(result);
CodePudding user response:
const dd = [{
keyone: "test",
two: "you",
three: 'op'
},
{
keyone: "youuuu",
two: "ttt",
three: 'op'
},
{
keyone: "operation",
two: "test",
three: 'op'
}
];
const pullOut = (...keys) => {
return keys.map(key => {
const val = dd.reduce((pV, cV, cI) => {
pV.push(cV[key]);
return pV;
}, []);
return { [key]: val };
});
};
console.log(pullOut('keyone', 'two'));
