Javascript forEach方法似乎跳过了一个条目 目标
我正在尝试创建一个函数,它将获取一个“投票”数组,并返回一个对象,其中包含每个“候选人”获得1分的次数 例如,一个数组,例如:Javascript forEach方法似乎跳过了一个条目 目标,javascript,node.js,arrays,object,Javascript,Node.js,Arrays,Object,我正在尝试创建一个函数,它将获取一个“投票”数组,并返回一个对象,其中包含每个“候选人”获得1分的次数 例如,一个数组,例如: [ { "blue": 1, "red": 3, "purple": 2, "yellow": 4 }, { "blue": 2, "red&
[
{
"blue": 1,
"red": 3,
"purple": 2,
"yellow": 4
},
{
"blue": 2,
"red": 3,
"purple": 4,
"yellow": 1
},
{
"blue": 1,
"red": 2,
"purple": 4,
"yellow": 3
},
{
"blue": 3,
"red": 4,
"purple": 2,
"yellow": 1
}
];
应该返回一个对象
{
"blue": 2,
"red": 0,
"purple": 0,
"yellow": 2
}
现行代码 目前我已经编写了这个函数
// adds up the first choice results from raw data
// return object containing number of first choice votes each candidate received
const add_first_choices = function (raw_data) {
// create object to store number of first choices
const storage_obj = empty_candidate_obj(raw_data);
// loop through results, adding first choices to storage_obj
raw_data.forEach(function (single_voter_obj) {
Object.values(single_voter_obj).forEach(function (value) {
if (value === 1) {
storage_obj[getKeyByValue(single_voter_obj, value)] += 1;
}
});
});
return storage_obj;
};
它使用以下两个其他函数
// returns object of candidate names, each with value of 0
const empty_candidate_obj = function (raw_data) {
const input_data = raw_data;
let first_vote = input_data[0];
const keys = Object.keys(first_vote);
keys.forEach(function (key) {
first_vote[key] = 0;
});
return first_vote;
};
及
问题 当将上述数组输入到我的函数中时,它返回
{
blue: 1,
red: 0,
purple: 0,
yellow: 2
}
=>不像预期的那样
你知道我做错了什么吗
感谢您的回复:)问题在于这一行:
const input_data = raw_data;
复制对象数组是有问题的,因为复制数组不会自动创建对象的新副本。它只是一个引用了原始对象的新数组,因此,如果在新数组中更改对象,就是在更改原始对象
因此,您也需要:
你可以用更简单的方法解决你的问题
const data=[{“蓝”:1,“红”:3,“紫”:2,“黄”:4},{“蓝”:2,“红”:3,“紫”:4,“黄”:1},{“蓝”:1,“红”:2,“紫”:4,“黄”:3},{“蓝”:3,“红”:4,“紫”:2,“黄”:1};
//我们用一个新的`{}`对象初始化'reduce',
//它会随着每次迭代而更新。
//`acc`是累加器,`c`是当前元素
常量结果=数据减少((acc,c)=>{
//对于数组中的每个对象,我们获取键和值
Object.entries(c.forEach)([key,value])=>{
//如果我们的初始对象还没有密钥
//如果匹配,则创建一个并将其设置为零
acc[键]=acc[键]| 0;
//如果值为1,则增加该属性的值
如果(值===1)acc[键]+;
});
//确保返回初始对象
//对于下一次迭代
返回acc;
}, {});
控制台日志(结果)代码>您可能希望使用类似以下内容的减速器:
const结果=[
{
“蓝色”:1,
"红":三,,
“紫色”:2,
“黄色”:4
},
{
“蓝色”:2,
"红":三,,
“紫色”:4,
“黄色”:1
},
{
“蓝色”:1,
“红色”:2,
“紫色”:4,
“黄色”:3
},
{
“蓝色”:3,
“红色”:4,
“紫色”:2,
“黄色”:1
}
];
常量空对象={
“蓝色”:0,
“红色”:0,
“紫色”:0,
“黄色”:0
}
结果=结果.reduce(减速机,空对象)
console.log(结果)
功能减速机(acc、val){
用于(输入val)
如果(val[key]==1)acc[key]++;
返回acc;
}
关于您的代码,问题出在这行空的\u候选者\u obj函数中
let first_vote = input_data[0];
更新您的代码以发送副本
let first_vote={…input_data[0]}
对象在引用上工作。因此,数据集值中的第一个对象与空对象一样被更新为0,请尝试以下功能:
函数候选Core1Times(数组){
常量newObj={}
for(数组的常量分数){
Object.keys(score.forEach)(elem=>{
if(newObj[elem]!=null){
如果(分数[elem]==1){
newObj[elem]++
}
}否则{
分数[elem]==1?newObj[elem]=1:newObj[elem]=0
}
})
}
返回newObj
}
常量输出={};对于(原始数据的常数o){for(o中的常数key){output[key]| |=0;如果(o[key]==1)output[key]+}
在这种情况下,调试技巧非常方便。查看一些提示开始吧。
const input_data = raw_data.map(obj => ({...obj}));
let first_vote = input_data[0];