首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据ID映射答案

根据ID映射答案
EN

Stack Overflow用户
提问于 2021-11-03 12:42:23
回答 4查看 65关注 0票数 1

对于这样的测验,我有一个对象数组。

代码语言:javascript
复制
[
    {
        answer: "Patience"
        question: "Name a GNR song..."
        questionId: 13
        questiontype: "text"
        userId: 1
    },
    {
        answer: "ABC"
        question: "Select three MJ songs..."
        questionId: 14
        questiontype: "checkbox"
        userId: 1
    },
    {
        answer: "Thriller"
        question: "Name three MJ songs..."
        questionId: 14
        questiontype: "checkbox"
        userId: 1
    }
]

我想做的是在页面上显示它们。所以现在我正在做这样的事情

代码语言:javascript
复制
{quizData.map((item, index) => {
  return (
    <div key={index}>
      <Col xs={12}>
        <p className="text-start quiz-text">
          <strong>
            Question {item.question}
          </strong>
        </p>
      </Col>
      <Col xs={12}>
        <p className="text-start argent c-font quiz-text">{item.answer}</p>
      </Col>
    </div>
  );
})}

问题是这将为每个答案显示一个新的问题行。因此,对于上面的数据,我看到的内容如下所示

代码语言:javascript
复制
Name a GNR song
    Patience

Select 3 MJ songs
    ABC
    
Select 3 MJ songs
    Thriller

我尝试做的是只有一个问题,但如果该问题有多个答案,则将这些答案显示为该问题的一部分。因此,上面的内容类似于

代码语言:javascript
复制
Name a GNR song
    Patience

Select 3 MJ songs
    ABC
    Thriller

我假设我必须以某种方式匹配questionId,但不确定如何在我的地图中实现这一点?

任何建议都很感谢。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-11-03 13:27:01

您可以首先使用Map构造函数将唯一的问题ID放入一个数组中,如下所示:

代码语言:javascript
复制
var uniqueQIDs = [...new Map(data.map(obj => [obj.questionId, obj])).values()].map(obj => obj.questionId);

然后,您可以循环每个问题ID,并根据它过滤原始数据,如下所示:

代码语言:javascript
复制
{uniqueQIDs.map((qID, index) => {
  return (
    <div key={index}>
      <Col xs={12}>
        <p className="text-start quiz-text">
          <strong>
            Question {qID}
          </strong>
        </p>
      </Col>
      <Col xs={12}>
        {quizData.filter(obj => obj.questionId === qID).map(obj => {
          return <p>{ obj.answer }</p>
        })}
      </Col>
    </div>
  );
})}
票数 1
EN

Stack Overflow用户

发布于 2021-11-03 13:49:18

您要做的是按questionId对数组中的每个对象进行分组。因此,为了做到这一点,您可以通过以下方式实现this answer中提到的groupBy()的普通版本

代码语言:javascript
复制
const groupBy = (list, keyGetter) => {
    const map = new Map();
    list.forEach((item) => {
         const key = keyGetter(item);
         const collection = map.get(key);
         if (!collection) {
             map.set(key, [item]);
         } else {
             collection.push(item);
         }
    });
    return map;
}

在此之后,您可以简单地将其用作

代码语言:javascript
复制
// list of your question objects
var questions = [
    {
        answer: "Patience",
        question: "Name a GNR song...",
        questionId: 13,
        questiontype: "text",
        userId: 1,
    },
    {
        answer: "ABC",
        question: "Select three MJ songs...",
        questionId: 14,
        questiontype: "checkbox",
        userId: 1,
    },
    {
        answer: "Thriller",
        question: "Name three MJ songs...",
        questionId: 14,
        questiontype: "checkbox",
        userId: 1,
    }
];

// groupBy function here shall return a Map object having questionId as key and
// list of objects having that questionId as value as specified in callback passed in
const myMap = groupBy(questions, x => x.questionId)

// Now you can simply iterate over the myMap object by using forEach
myMap.forEach(
    group => { // group is the list of objects having same questionId
        console.log(group[0].question);
        group.map( // you can simply map your group like this
            object => console.log("   ", object.answer) 
        )
    }
)

// OUTPUT:

// Name a GNR song...
//     Patience
// Select three MJ songs...
//     ABC
//     Thriller

More about Map forEach

票数 2
EN

Stack Overflow用户

发布于 2021-11-03 12:53:06

在实现之前,您可以使用array.filter()或for循环来修改数组。在jsx的map中实现之前,必须生成正确的数组

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69825045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档