Lodash:将具有重复值的数组转换为具有重复出现次数的对象

Lodash: Convert array with duplicate values to object with number of repeated occurrences

这是我的数组:

['California','Texas','Texas','Texas','New York','Missouri','New Mexico','California']

lodash 中有没有一种方法可以将其转换为具有重复出现计数的对象,如下所示:

[
    {'name':'California', 'count':2},
    {'name':'Texas', 'count':3},
    {'name':'New York', 'count':1},
    {'name':'Missouri', 'count':1},
    {'name':'New Mexico', 'count':1},
]

我试过很多组合都没有成功。文档:https://lodash.com/docs#countBy

我不确定是否有内置函数可以实现它,但您可以使用标准方法实现。

var arr = ['California', 'Texas', 'Texas', 'Texas', 'New York', 'Missouri', 'New Mexico', 'California'];
var obj = [];

arr.forEach(a => {
    var b = obj.find(b => b.name == a);
    if(!b){
        obj.push({
            name: a,
            count: 1
        });
    }else{
        b.count++;
    }
});

console.log(JSON.stringify(obj, null, 2));

您可以使用 reduce()

var ar = ['California','Texas','Texas','Texas','New York','Missouri','New Mexico','California'];

var obj = {}
var result = ar.reduce(function(r, e) {
  if(!obj[e]) {
    obj[e] = {name: e, count: 0};
    r.push(obj[e])
  }
  obj[e].count++;
  return r;
}, [])

console.log(result)

正如您所说,有 countBy 函数,您必须映射结果以根据需要设置格式:

var result = _( array )
  .countBy( )
  .map( ( key, value ) => ( { name: key, count: value } ) )
  .value( )

console.log( result );

在普通 Javascript 中,您可以使用 Array#forEach

var data = ['toString', 'California', 'Texas', 'Texas', 'Texas', 'New York', 'Missouri', 'New Mexico', 'California'],
    count = [];

data.forEach(function (a) {
    if (!this[a]) {
        this[a] = { name: a, count: 0 };
        count.push(this[a]);
    }
    this[a].count++;
}, Object.create(null));

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

版本 {}

var data = ['toString', 'California', 'Texas', 'Texas', 'Texas', 'New York', 'Missouri', 'New Mexico', 'California'],
    count = [];

data.forEach(function (a) {
    if (!this[a]) {
        this[a] = { name: a, count: 0 };
        count.push(this[a]);
    }
    this[a].count++;
}, {}); // no Object.create(null)!

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

您可以只映射 _.countBy 的结果。

var array = ['California','Texas','Texas','Texas','New York','Missouri','New Mexico','California'],
    count = _.countBy(array),
    result = _.map(count, (v, k) => ({ name: k, count: v }));

console.log(count);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

结合_.chain

var array = ['California','Texas','Texas','Texas','New York','Missouri','New Mexico','California'],
    count = _
        .chain(array)
        .countBy()
        .map((v, k) => ({ name: k, count: v }));

console.log(count);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

纯 JS,仅两行。

var arr = ['California','Texas','Texas','Texas','New York','Missouri','New Mexico','California'],
    lut = arr.reduce((p,c) => p[c] ? (p[c]++ ,p) : (p[c] = 1, p),{});
 result = Object.keys(lut).map(k => ({name:k,count:lut[k]}));
console.log(result);