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

时间:2016-08-30 16:07:18

标签: javascript arrays object underscore.js lodash

这是我的阵列:

['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

6 个答案:

答案 0 :(得分:4)

您只需映射_.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>
&#13;
&#13;
&#13;

结合_.chain

&#13;
&#13;
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);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用reduce()

执行此操作

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

console.log( result );

答案 4 :(得分:0)

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

&#13;
&#13;
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)
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

带有{}

的版本

&#13;
&#13;
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)
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 5 :(得分:0)

纯粹的JS只有两行。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

相关问题