在Javascript数组中循环对象并计算相似项

问题描述 投票:1回答:2

我正在尝试遍历对象数组,并在满足某些条件时为特定键获取相似值的计数。我先尝试在一个数组(存储)上循环,但随后意识到条件必须是动态的。他们不是现在。我输入了“人力资源和食品”,但理想情况下想进行这些设置。因此,我要遍历arrayC中的值并针对这些值针对存储进行交叉检查。如果我循环一次(在arrayC中只有一个值),它可以工作,但循环得更多,它循环了太多次,给了我错误的输出。尝试获取所有与数据和服务相关的相似奖励属性的计数。例如,因此所有数据:“ HR”和服务:“ Food”的对象将合并以反映:{data:HR,service:Food,DDR:3}

代码:

var arrayC = ["DDM","DDR"]; 
        var storage =  [
        { data: 'CT', service: 'Food',award: 'DDM' },
        { data: 'HR', service: 'Food',award: 'DDM' },
        { data: 'HR', service: 'Food',award: 'DDR' },
        { data: 'HR', service: 'Food',award: 'DDR' },
        { data: 'HR', service: 'Food',award: 'DDR' }
        ];
    
    var array1=[];
    var arrayTest = [];
    var jk ={};
    
    function getIt () {
    arrayC.forEach(function(key,value){
     
      $.each(storage, function(k,x){
       // console.log(v.award);
        if(key==x.award&&x.data=="HR"&&x.service=="Food"){
          jk[x.award] = jk.hasOwnProperty(x.award) ? arrayTest.push(x.award) : arrayTest.push(x.award), 
          jk.data = x.data,
          jk.service = x.service
          
        } 
      }); //inside each  
    });
      //array1.push(jk); 
      return jk;
    }
    
    var newThing = getIt();
    console.log(newThing);

    //Output: 
    //Object {
     // data: "HR",
     // DDM: 1,
     // DDR: 4,
     // service: "Food"
    //}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
javascript arrays foreach counting
2个回答
1
投票

您可以使用所需键的数量来构建嵌套对象。

var storage =  [{ data: 'CT', service: 'Food',award: 'DDM' }, { data: 'HR', service: 'Food',award: 'DDM' }, { data: 'HR', service: 'Food',award: 'DDR' }, { data: 'HR', service: 'Food',award: 'DDR' }, { data: 'HR', service: 'Food',award: 'DDR' }],
    keys = ['data', 'service', 'award'],
    counts = storage.reduce(function (r, o) {
        var last = o[keys[keys.length - 1]],
            reference = keys
                .slice(0, -1)
                .reduce(function (q, k) { return q[o[k]] = q[o[k]] || {}; }, r);
        reference[last] = (reference[last] || 0) + 1;
        return r;
    }, {});

console.log(counts);

0
投票

您可以使用reduce以及data和service组合字符串作为计数的键。

var storage = [
    { data: 'CT', service: 'Food', award: 'DDM' },
    { data: 'HR', service: 'Food', award: 'DDM' },
    { data: 'HR', service: 'Food', award: 'DDR' },
    { data: 'HR', service: 'Food', award: 'DDR' },
    { data: 'HR', service: 'Food', award: 'DDR' }
];

var res = storage.reduce(function (x, cur) {
    let item = cur.data + cur.award
    if (!x[item]) x[item] = 0;
    x[item] = x[item] + 1
    return x
}, {})
var results = []

for (const key in res) {
    const count = res[key];
    const data = key.slice(0, 2)
    const service = key.slice(2)
    results.push({
        data: data,
        service: service,
        count: count
    })
}
console.log(results)
© www.soinside.com 2019 - 2024. All rights reserved.