简体   繁体   English

破坏嵌套的对象数组javascript

[英]Destruct nested array of objects javascript

Answers is a array of objects, and i need to filter to achieve a desired output. Answers 是一组对象,我需要过滤以实现所需的输出。

const answers = [
    {   

        "surveyVersion": "5",
        "id": "550259bd-2164-4f5b-b477-49cd2afc5829",
        "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
        "surveyName": "Compass",
        "createdAt": 1585244952251,
        "survey": [
            {
                "data": {
                    "statement": "De 0 a 10, qual a chance de você RECOMENDAR o Compass?",
                    "answer": {
                        "label": "7",
                        "value": "7"
                    }
                }
            },
            {
                "data": {
                    "statement": "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?",
                    "answer": {
                        "label": "7",
                        "value": "6"
                    }
                }
            },
            {
                "data": {
                    "statement": "De 0 a 10, qual a nota voce da para o interior o Compass?",
                    "answer": {
                        "label": "7",
                        "value": "8"
                    }
                }
            }
        ]

    },
    {   

        "surveyVersion": "5",
        "id": "c720e777-5085-4493-bed9-c70bc311f47d",
        "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
        "surveyName": "Compass",
        "createdAt": 1585244952251,
        "survey": [
            {
                "data": {
                    "statement": "De 0 a 10, qual a chance de você RECOMENDAR o Compass?",
                    "answer": {
                        "label": "7",
                        "value": "3"
                    }
                }
            },
            {
                "data": {
                    "statement": "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?",
                    "answer": {
                        "label": "7",
                        "value": "4"
                    }
                }
            },
            {
                "data": {
                    "statement": "De 0 a 10, qual a nota voce da para o interior o Compass?",
                    "answer": {
                        "label": "7",
                        "value": "5"
                    }
                }
            }
        ]

    }
]

I must create a Key[data.statement] : Value[data.answer.value] for each data object inside the survey property array.我必须为调查属性数组中的每个数据对象创建一个Key[data.statement] : Value[data.answer.value]

Desired output:期望的输出:

[
   {   

       "surveyVersion": "5",
       "id": "550259bd-2164-4f5b-b477-49cd2afc5829",
       "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
       "surveyName": "Compass",
       "createdAt": 1585244952251,
       "De 0 a 10, qual a chance de você RECOMENDAR o Compass?":"7" ,
       "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?":"6",
       "De 0 a 10, qual a nota voce da para o interior o Compass?":"8"


   },
   {   

       "surveyVersion": "5",
       "id": "c720e777-5085-4493-bed9-c70bc311f47d",
       "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
       "surveyName": "Compass",
       "createdAt": 1585244952251,
        "De 0 a 10, qual a chance de você RECOMENDAR o Compass?":"3" ,
        "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?":"4",
        "De 0 a 10, qual a nota voce da para o interior o Compass?":"5"

   }
]



I tried two approaches, one using map:我尝试了两种方法,一种使用地图:

 let values = answers.map(item => ({
        ...item,
        id: item.id,
        survey: item.surveyName,
        answer: item.survey.map(function(node) {
          return {
            [node.data.statement]: node.data.answer.value
          };
        })
      }));

Output:输出:

[{
        "surveyName": "Compass",
        "createdAt": 1585244952251,
        "survey": "Compass",
        "surveyVersion": "5",
        "id": "550259bd-2164-4f5b-b477-49cd2afc5829",
        "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
        "answer": [{
                "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "7"
            },
            {
                "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?": "8"
            },
            {
                "De 0 a 10, qual a nota voce da para o interior o Compass?": "6"
            }
        ]

    },

    {
        "surveyName": "Compass",
        "createdAt": 1585244949217,
        "survey": "Compass",
        "surveyVersion": "4",
        "id": "5156be07-2dc4-47f6-b7c4-1fc5089db0b6",
        "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
        "answer": [{
                "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "3"
            },
            {
                "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?": "4"
            },
            {
                "De 0 a 10, qual a nota voce da para o interior o Compass?": "5"
            }
        ]

    }


]

And another aproach using destructuring, that is a amazing but i couldnt figure out how to loop inside of the survey array.还有另一种使用解构的方法,这是一个了不起的方法,但我无法弄清楚如何在调查数组内部循环。

for (const {id:id,surveyName:surveyName,surveyVersion:surveyVersion,surveyId:surveyId,createdAt:createdAt,survey:[{data:{statement,answer:{value}}}]} of answers)
  output = {id,surveyName,surveyVersion,surveyId,createdAt,statement:value}

Output:输出:

{
         "id": "e233582b-06b7-4257-98a8-8e669a8a341d",
         "surveyName": "Compass",
         "surveyVersion": "1",
         "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
         "createdAt": 158524492683,
         "statement": "De 0 a 10, qual a chance de você RECOMENDAR o Compass?",
         "value": "7"
     }

Appreciate any help感谢任何帮助

You can do it with .map() and then with .forEach() inside this:你可以用.map()然后用.forEach()这一点:

const output = answers.map(child => {
  child.survey.forEach(item => child[item.data.statement] = item.data.answer.value);
  delete child.survey;
  return child;
})

console.log(output);

 const answers = [ { "surveyVersion": "5", "id": "550259bd-2164-4f5b-b477-49cd2afc5829", "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8", "surveyName": "Compass", "createdAt": 1585244952251, "survey": [ { "data": { "statement": "De 0 a 10, qual a chance de você RECOMENDAR o Compass?", "answer": { "label": "7", "value": "7" } } }, { "data": { "statement": "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?", "answer": { "label": "7", "value": "6" } } }, { "data": { "statement": "De 0 a 10, qual a nota voce da para o interior o Compass?", "answer": { "label": "7", "value": "8" } } } ] }, { "surveyVersion": "5", "id": "c720e777-5085-4493-bed9-c70bc311f47d", "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8", "surveyName": "Compass", "createdAt": 1585244952251, "survey": [ { "data": { "statement": "De 0 a 10, qual a chance de você RECOMENDAR o Compass?", "answer": { "label": "7", "value": "3" } } }, { "data": { "statement": "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?", "answer": { "label": "7", "value": "4" } } }, { "data": { "statement": "De 0 a 10, qual a nota voce da para o interior o Compass?", "answer": { "label": "7", "value": "5" } } } ] } ] const output = answers.map(child => { child.survey.forEach(item => child[item.data.statement] = item.data.answer.value); delete child.survey; return child; }) console.log(output);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Output:输出:

[
  {
    "surveyVersion": "5",
    "id": "550259bd-2164-4f5b-b477-49cd2afc5829",
    "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
    "surveyName": "Compass",
    "createdAt": 1585244952251,
    "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "7",
    "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?": "6",
    "De 0 a 10, qual a nota voce da para o interior o Compass?": "8"
  },
  {
    "surveyVersion": "5",
    "id": "c720e777-5085-4493-bed9-c70bc311f47d",
    "surveyId": "123ebeff-9b48-4637-ac63-f0fce9f1abb8",
    "surveyName": "Compass",
    "createdAt": 1585244952251,
    "De 0 a 10, qual a chance de você RECOMENDAR o Compass?": "3",
    "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?": "4",
    "De 0 a 10, qual a nota voce da para o interior o Compass?": "5"
  }
]

You could just be very explicit about it, if you wanted.如果你愿意,你可以非常明确地说明它。 This works, is very straightforward to read and understand, and doesn't take very many lines of code.这是有效的,非常易于阅读和理解,并且不需要很多代码行。

let values = [];

for (let ans of answers) {
    let item = {};
    item["surveyVersion"] =  ans["surveyVersion"]
    item["id"] = ans["surveyVersion"]
    item["surveyId"] = ans["surveyVersion"]
    item["surveyName"] = ans["surveyVersion"]
    item["createdAt"] = ans["surveyVersion"]
    for(let resp of ans.survey) {
        item[resp.data.statement] = resp.data.answer.value;
    }
    values.push(item);
}

Use map , forEach loop with destructuring.使用map , forEach循环进行解构。

 const updated = data => data.map(({ survey, ...item }) => { survey.forEach( ({ data: { statement, answer: { value } } }) => (item[statement] = value) ); return item; }); const answers = [ { surveyVersion: "5", id: "550259bd-2164-4f5b-b477-49cd2afc5829", surveyId: "123ebeff-9b48-4637-ac63-f0fce9f1abb8", surveyName: "Compass", createdAt: 1585244952251, survey: [ { data: { statement: "De 0 a 10, qual a chance de você RECOMENDAR o Compass?", answer: { label: "7", value: "7" } } }, { data: { statement: "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?", answer: { label: "7", value: "6" } } }, { data: { statement: "De 0 a 10, qual a nota voce da para o interior o Compass?", answer: { label: "7", value: "8" } } } ] }, { surveyVersion: "5", id: "c720e777-5085-4493-bed9-c70bc311f47d", surveyId: "123ebeff-9b48-4637-ac63-f0fce9f1abb8", surveyName: "Compass", createdAt: 1585244952251, survey: [ { data: { statement: "De 0 a 10, qual a chance de você RECOMENDAR o Compass?", answer: { label: "7", value: "3" } } }, { data: { statement: "De 0 a 10, qual a nota voce dar para a qualidade do atendimento?", answer: { label: "7", value: "4" } } }, { data: { statement: "De 0 a 10, qual a nota voce da para o interior o Compass?", answer: { label: "7", value: "5" } } } ] } ]; console.log(updated(answers));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM