开发者问题收集

计算对象属性的重复数组以生成新数组

2019-04-02
103

我有这个对象数组

[{
    tag: 'james'
  },
  {
    tag: 'james'
  },
  {
    tag: 'john'
  }
]

如何计算并生成如下所示的新数组?

[{
  tag: 'james',
  count: 2
}, {
  tag: 'john',
  count: 1
}]

我尝试使用 reduce 生成的是对象而不是对象数组。

const arr = [{tag: 'james'},{tag: 'james'},{tag: 'john'}];
let newArr = arr.reduce((accum, arr) => {
  accum[arr.tag] = ++accum[arr.tag] || 1
  return accum
}, {})

console.log(newArr)
3个回答

创建一个对象而不是数字,最后使用 Object.values 方法从对象中获取这些值。

// just extract values from the object as an array
let res = Object.values(arr.reduce((accum, o) => {
  // initialize object if not defined already
  accum[o.tag] = accum[o.tag] || { ...o, count: 0  }
  // increment count property
  accum[o.tag].count++;
  return accum
}, {}))
let arr = [{tag: 'james'},{tag: 'james'},{tag: 'john'}]

let res = Object.values(arr.reduce((accum, o) => {
  accum[o.tag] = accum[o.tag] || { ...o, count: 0 }
  accum[o.tag].count++;
  return accum
}, {}))

console.log(res)


您甚至可以通过使用额外的变量来引用对象/索引来直接创建数组。

// an object for keeping reference 
let ref = {};

let res = arr.reduce((accum, o) => {
  // check reference already defined, if not define refernece and push to the array
  ref[o.tag] || accum.push(ref[o.tag] = { ...o, count: 0 })
  // update count using the refernece keeped in the object
  ref[o.tag].count++;
  return accum
}, []);
let arr = [{tag: 'james'},{tag: 'james'},{tag: 'john'}]

let ref = {};

let res = arr.reduce((accum, o) => {
  ref[o.tag] || accum.push(ref[o.tag] = { ...o, count: 0 })
  ref[o.tag].count++;
  return accum
}, []);

console.log(res)
Pranav C Balan
2019-04-02

您几乎已经完成了,但您需要从对象中取出键和值并构建一个新数组。

var array = [{ tag: 'jane' }, { tag: 'jane' }, { tag: 'john' }],
    result = Object
        .entries(
            array.reduce((accum, { tag }) => {
                accum[tag] = (accum[tag] || 0) + 1;
                return accum;
            }, {}))
        .map(([tag, count]) => ({ tag, count }));

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

首先测试对象是否不存在 - 如果不存在,则创建一个。然后添加到累加器。另请注意,您需要一个数组,因此对累加器值使用 [] 而不是 {

const data = [{
    tag: 'james'
  },
  {
    tag: 'james'
  },
  {
    tag: 'john'
  }
];

const grouped = data.reduce((acc, { tag }) => {
  if (!acc.some(e => e.tag == tag)) {
    acc.push({ tag, count: 0 });
  }
  acc.find(e => e.tag == tag).count++;
  return acc;
}, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Jack Bashford
2019-04-02