Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript forEach方法似乎跳过了一个条目 目标_Javascript_Node.js_Arrays_Object - Fatal编程技术网

Javascript forEach方法似乎跳过了一个条目 目标

Javascript forEach方法似乎跳过了一个条目 目标,javascript,node.js,arrays,object,Javascript,Node.js,Arrays,Object,我正在尝试创建一个函数,它将获取一个“投票”数组,并返回一个对象,其中包含每个“候选人”获得1分的次数 例如,一个数组,例如: [ { "blue": 1, "red": 3, "purple": 2, "yellow": 4 }, { "blue": 2, "red&

我正在尝试创建一个函数,它将获取一个“投票”数组,并返回一个对象,其中包含每个“候选人”获得1分的次数

例如,一个数组,例如:

[
    {
        "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];