鍍金池/ 問答/數(shù)據(jù)分析&挖掘  Java  HTML/ js查找對象數(shù)組元素中的key,如果有則替換,沒有則添加

js查找對象數(shù)組元素中的key,如果有則替換,沒有則添加

現(xiàn)在有一數(shù)組,我需要判斷里面是否有我當前的questionId,如果有則用一個js對象替換,沒有則直接添加。我想用for循環(huán)的方式來查找,但是總會被添加好多次,請大家?guī)兔聪拢?/p>

即:用temp里面的questionId和data里面的questionId進行比較,如果data里面有這個questionId,則用temp里面的answer替換相應的answer,如果data里面沒有這個questionId,則直接添加temp數(shù)據(jù)到data。

問題:我用for循環(huán)遍歷的時候,總會重復添加數(shù)據(jù),就是說每次都會重復遍歷數(shù)據(jù)。

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

// 當前選中的選項數(shù)據(jù)
let temp={
  type:1,
  answer:optionId,//對應上面的數(shù)字30,42
  questionId:radio.questionnaireQuestionsId//對應上面的數(shù)字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 {
  // 已經(jīng)有答案則判斷是否該題答案
  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)
    }
  }
}
回答
編輯回答
風畔

MDN官網(wǎng)有這么一段話

clipboard.png

所以for...in在這里并不可靠
此處在循環(huán)前保存一個length,用下標遍歷就好了

2017年10月9日 02:11
編輯回答
柒槿年

題主可能是邏輯弄暈了,你看對不對

// 已經(jīng)有答案則判斷是否該題答案
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 循環(huán)優(yōu)化下:

let isExist=answers.some((val,index)=>{
    return id===val[index].questionId;
});
2017年5月4日 07:08