迭代对象的对象并在每个对象中插入键值对

问题描述 投票:0回答:2

我试图迭代一个内部有许多较小对象的对象。我想有条件地在每个较小的对象中插入一个键值对 例如:

const answers = {
    "question1": {
        answer: "Poor",
        metric: "focus" 
    },
    "question2": {
        answer: {agree: "yes", duration: "10"}
        metric: "exercise"
    }
}

因此,假设问题 1 的答案可以是差、好或优秀,差等于 1 分,好等于 5 分,优秀等于 10 分。 根据问题 1 中的答案,我想添加一个键值对,如 Score: 1 到问题 1 对象中

然后对于问题 2,我们查看持续时间,持续时间 10 给我们 10 分 所以我们插入键值对,如分数:10

所以最后我想返回一个看起来像这样的对象:

newAnswers = {
    "question1": {
        answer: "Poor",
        metric: "focus",
        score: 1
    },
    "question2": {
        answer: {agree: "yes", duration: "10"}
        metric: "exercise",
        score: 10
    }
}

在这个例子中,为了简单起见,我只显示了两个问题,但实际上可能有很多问题,并且相同的逻辑将适用于所有其他问题。

提前致谢

javascript loops object oop javascript-objects
2个回答
1
投票

基本上你需要的是循环逻辑

这样的事情会有帮助。

逻辑

  • 循环对象中的条目
  • 检查每个对象中
    answer
    键的类型
  • 如果类型是字符串,则在
    "poor", "good", "excellent"
    选项之间进行映射。
  • 如果其对象检查
    duration
    的有效性并将其分配给分数。

工作小提琴

const answers = {
    "question1": {
        answer: "Poor",
        metric: "focus" 
    },
    "question2": {
        answer: {agree: "yes", duration: "10"},
        metric: "exercise"
    }
};

Object.entries(answers).forEach((item) => {
  const answer = item[1].answer;
  switch (typeof answer) {
    case "string":
      console.log(answer);
      const answerOptions = ["poor", "good", "excellent"];
      const scoreOptions = [1, 5, 10];
      const index = answerOptions.indexOf(answer.toLowerCase());
      if(index !== -1) {
        item[1].score = scoreOptions[index];
      }
      break;
    case "object":
      if (answer.duration && !isNaN(answer.duration)) {
        item[1].score = +answer.duration;
      }
      break;
  }
});
console.log(answers)


0
投票

使用 jQuery

如果我正确理解你的问题,问题是如何为每个 JSON 对象插入新属性。如果是这种情况,您可以按照以下步骤操作。

answers["question1"]["score"] = 1;

忽略对逻辑的条件检查(即条件语句),迭代可能是:

$.each(answers, (q) => {
   q["score"] = x;
}

© www.soinside.com 2019 - 2024. All rights reserved.