怎么判断JSON对象中value存在重复值次数多少

怎么判断JSON对象中value存在重复值次数多少?
假设是等待处理,判断这个相同值总共多少个,然后新建 JSON,如下:

原数据:

[
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "正在处理"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "完成"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"}
]

处理

[
    {key:"等待处理",len:3},
    {key:"正在处理",len:1},
    {key:"完成",len:1}
]

这个方法怎么写?

阅读 7.9k
9 个回答
let arr = [], // 初始数据集
    res = {}; // 结果
arr.forEach(item => {
    if(!res[item.value]) {
        res[item.value] = {
            key: item.value,
            len: 1
        }
    } else {
        res[item.value].len++;
    }
})

res = Object.values(res);

可以用ramda.js

http://ramdajs.com/docs/#countBy

var data = [
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "正在处理"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "完成"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"}
];
R.countBy(R.prop('value'))(data);    //=> {"完成": 1, "正在处理": 1, "等待处理": 3}
var O = arr.map(a => a['value']).reduce((o, k) => [o[k] = (o[k] || 0) + 1, o][1], {});
Object.keys(O).map(key => {return {key: key, len: O[key]}})

写了一个简单易懂的:

function countValue (arr) {
  var does = {
    key: '等待处理',
    len: 0
  };
   var doing = {
    key: '正在处理',
    len: 0
   };
   var done = {
    key: '已处理',
    len: 0
   };
  var newArr = [];
  for(var i =0;i <arr.length; i++) {
    switch(arr[i].value) {
      case '等待处理': does.len++;break;
      case '正在处理': doing.len++;break;
      case '已处理': done.len++;break;
    }
  }
  newArr.push(does);
  newArr.push(doing);
  newArr.push(done);
  return newArr
}

结果如图:
图片描述

lodash 里面有一个 unionBy() 方法. 可以去看看lodash#unionBy

说白点就是去重嘛

如果处理结果非要是这种对象的数组的话,没有简单办法,双层循环慢慢++就好。

如果”等待处理“这样的字眼能换成英文的表示,还能用对象模拟一下map,只循环目标数据就好

var arr2 = arr1.reduce((all,a)=>{
    if(all[a.value]){
        all[a.value]++
    }else {
        all[a.value]=1
    }
    return all;

},[]);
console.log(Object.keys(arr2).map(key=>({key:key,len:arr2[key]})
Array.from(data.reduce((m, x) => m.set(x.value, (m.get(x.value) || 0) + 1), new Map()))
  .map(([key, len]) => ({key, len}))
新手上路,请多包涵

如果已知需要处理的值的话

var arrStr=JSON.stringify([
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "正在处理"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"},
    {name: "fcf294131", key: "处理进度", value: "完成"},
    {name: "fcf294131", key: "处理进度", value: "等待处理"}
])
res=[
    {key: "等待处理", len: arrStr.split("等待处理").length-1},
    {key: "正在处理", len: arrStr.split("正在处理").length-1},
    {key: "完成", len: arrStr.split("完成").length-1}
]

当然没有考虑性能,只是取巧简洁一点hhhh

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏