js查找对象数组元素中的key,如果有则替换,没有则添加

现在有一数组,我需要判断里面是否有我当前的questionId,如果有则用一个js对象替换,没有则直接添加。我想用for循环的方式来查找,但是总会被添加好多次,请大家帮忙看下:

即:用temp里面的questionId和data里面的questionId进行比较,如果data里面有这个questionId,则用temp里面的answer替换相应的answer,如果data里面没有这个questionId,则直接添加temp数据到data。

问题:我用for循环遍历的时候,总会重复添加数据,就是说每次都会重复遍历数据。

let data=[
    {answer:"30",questionId:"34",type:"1"},
    {answer:"42",questionId:"35",type:"1"}
];

// 当前选中的选项数据
let temp={
  type:1,
  answer:optionId,//对应上面的数字30,42
  questionId:radio.questionnaireQuestionsId//对应上面的数字34,35
}

// 取回store中的答案
let data=this.$store.state.answers;//就是最上面的data
// 当前问题id
let id=temp.questionId;

if(answers.length==0){
  // 如果所有题目都未作答则直接提交
  this.$store.commit('addAnswer', data);
  console.log('开始作答')
}else {
  // 已经有答案则判断是否该题答案
  for(let i in answers) {
    let questionId = answers[i].questionId;

    if(id==questionId){
      // 如果存在答案则替换原答案
      this.$store.commit('delIndex',i);
      this.$store.commit('addAnswer',data);
      console.log('我要替换原来答案',data);
    }else if(id!=questionId){
      // 否则直接提交
      this.$store.commit('addAnswer',data);
      console.log('初次提交答案',data)
    }
  }
}
阅读 5.7k
2 个回答

题主可能是逻辑弄晕了,你看对不对

// 已经有答案则判断是否该题答案
let isExist = false;
for (let i in answers) {
    let questionId = answers[i].questionId;
    if (id === questionId) {
        isExist = true;
        break;
    }
}
if (isExist) {
    // 如果存在答案则替换原答案
    this.$store.commit('delIndex', i);
    this.$store.commit('addAnswer', data);
    console.log('我要替换原来答案', data);
} else {
    // 否则直接提交
    this.$store.commit('addAnswer', data);
    console.log('初次提交答案', data);
}

前面的 for 循环优化下:

let isExist=answers.some((val,index)=>{
    return id===val[index].questionId;
});

MDN官网有这么一段话

clipboard.png

所以for...in在这里并不可靠
此处在循环前保存一个length,用下标遍历就好了

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