Home > OS >  How does one, from a list objects, group and collect just specific values which are explicitly refer
How does one, from a list objects, group and collect just specific values which are explicitly refer

Time:01-19

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'));

  •  Tags:  
  • Related