我正在尝试遍历对象数组,并在满足某些条件时为特定键获取相似值的计数。我先尝试在一个数组(存储)上循环,但随后意识到条件必须是动态的。他们不是现在。我输入了“人力资源和食品”,但理想情况下想进行这些设置。所以我要遍历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>
答案 0 :(得分: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);
答案 1 :(得分:1)
您可以使用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)