如何通过对ID进行分组来获取数组的数组

时间:2019-01-31 13:06:56

标签: javascript

我有一个数组:

let ar = [{
   asst: 1,
   v: 'b'
 }, {
   emp: 4
 }, {
   journal_id: 3
 }, {
   asst: 4
 }, {
   asst: 1,
   v: 'a'
 }, {
   asst: 1,
   v: 'c'
 }, {
   journal_id: 3
 }, {
   journal_id: 3
 }]

我想要一个数组,其中asstjournal_id作为数组的数组,而emp作为具有asst和{{1 }}。 像这样:

journal_id

我已经尝试过了:

[[{asst:1, v: 'a'}, {asst:1, v: 'b'},{asst:1, v: 'c'}], [{asst:4}], [{journal_id:3}, {journal_id:3}, {journal_id:3}], {emp:4}]

JS Fiddle

3 个答案:

答案 0 :(得分:3)

这是使用reduceObject.values的简洁方法。另外,要检查的键在reduce函数的初始值中声明。

通过使用ES6解构,您可以使用emp在内部数组的最后重建所需的数组。

数组中有emp

const ar = [
  { asst: 1, v: 'b' },
  { emp: 4 },
  { journal_id: 3 },
  { asst: 4 },
  { asst: 1, v: 'a' },
  { asst: 1, v: 'c' },
  { journal_id: 3 },
  { journal_id: 3 }
];

const result = Object.values(ar.reduce((accum, e) => {
  Object.keys(accum).forEach(k => {
    if (k in e) accum[k].push(e);
  });
  return accum;
}, { asst: [], journal_id: [], emp: [] }));

console.log(result);

内部数组外部有emp

const ar = [
  { asst: 1, v: 'b' },
  { emp: 4 },
  { journal_id: 3 },
  { asst: 4 },
  { asst: 1, v: 'a' },
  { asst: 1, v: 'c' },
  { journal_id: 3 },
  { journal_id: 3 }
];

let result = ar.reduce((accum, e) => {
  Object.keys(accum).forEach(k => {
    if (k in e) accum[k].push(e);
  });
  return accum;
}, { asst: [], journal_id: [], emp: [] });

const { emp, ...otherProps } = result;
result = [...Object.values(otherProps), emp[0]];

console.log(result);

答案 1 :(得分:2)

您可以将所需分组键的值组合到一个键中,并以此值分组。

没有分组键的对象将直接推送到结果集中。

var array = [{ asst: 1, v: 'b' }, { emp: 4 }, { journal_id: 3 }, { asst: 4 }, { asst: 1, v: 'a' }, { asst: 1, v: 'c' }, { journal_id: 3 }, { journal_id: 3 }], keys = ['asst', 'journal_id'],
    keys = ['asst', 'journal_id'],
    result = array.reduce((hash => (r, o) => {
        if (keys.some(k => k in o)) {
            var key = keys.map(k => o[k]).join('|');
            if (!hash[key]) {
                r.push(hash[key] = []);
            }
            hash[key].push(o);
        } else {
            r.push(o);
        }
        return r;
    })({}), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:2)

您可以缩小Map中的数组,然后使用Map值创建一个新数组:

const data = [{"asst":1,"v":"b"},{"emp":4},{"journal_id":3},{"asst":4},{"asst":1,"v":"a"},{"asst":1,"v":"c"},{"journal_id":3},{"journal_id":3}];


const grouped = data.reduce(
  (result,item)=>{
    //key is item.asst or item.jornal_id or other
    const key = item.asst || item.journal_id || 'other';
    //set result(key) with empty array or existing array and conat new item
    return result.set(key,(result.get(key)||[]).concat(item));
  },new Map()
);
//get other values or empty array if they don't exist:
const others = grouped.get('other') || [];
//remove others if they exist:
grouped.delete('other');

//log array from Map values
console.log(others.concat([...grouped.values()]));