считать события и создавать объекты - PullRequest
0 голосов
/ 17 мая 2018

У меня есть такой массив

var myArray = [
    {id: "1" , category: "cat1", "question1": "blue", "question2":"blue"},
    {id: "1" , category: "cat1", "question1": "blue", "question2":"red"},
    {id: "2" , category: "cat2", "question1": "blue", "question2":"blue"},
    {id: "2" , category: "cat2", "question1": "red", "question2":"blue"}
    ];

Я бы хотел посчитать вхождения результата для каждого вопроса и создать новый массив с новыми объектами, подобными этому

var newArray = [
 {category: "cat1", question:"question1", blue:2, red:0},
 {category: "cat1", question:"question2", blue:1, red:1},
 {category: "cat2", question:"question1", blue:1, red:1},
 {category: "cat2", question:"question2", blue:2, red:0}
] 

Я пытаюсь использовать эту функцию

var result = myArray.reduce((r, {
                        category,
                        question1,
                        question2
                    }) => {
                         r.push({
                            category,
                            question1
                        }, {
                            category,
                            question2
                        })
                        return r;
                    }, [])

Вот фрагмент:

var myArray = [
  {id: "1" , category: "cat1", "question1": "blue", "question2":"blue"},
  {id: "1" , category: "cat1", "question1": "blue", "question2":"red"},
  {id: "2" , category: "cat2", "question1": "blue", "question2":"blue"},
  {id: "2" , category: "cat2", "question1": "red", "question2":"blue"}
];

var result = myArray.reduce((r, {
  category,
  question1,
  question2
}) => {
   r.push({
    category,
    question1
  }, {
    category,
    question2
  })
  return r;
}, [])

console.log(result);

1 Ответ

0 голосов
/ 17 мая 2018

Вам нужен другой подход, взяв хеш-таблицу и комбинированный ключ для доступа.

var array = [{ id: "1", category: "cat1", "question1": "blue", "question2": "blue" }, { id: "1", category: "cat1", "question1": "blue", "question2": "red" }, { id: "2", category: "cat2", "question1": "blue", "question2": "blue" }, { id: "2", category: "cat2", "question1": "red", "question2": "blue" }],
    result = Object.values(array.reduce((r, o) => {
        ['question1', 'question2'].forEach(question => {
            var key = [o.category, question].join('|');
            r[key] = r[key] || { category: o.category, question, blue: 0, red: 0 };
            r[key][o[question]]++;
        });
        return r;
    }, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

С динамическими вопросами (синий / красный):

var array = [{ id: "1", category: "cat1", "question1": "blue", "question2": "blue" }, { id: "1", category: "cat1", "question1": "blue", "question2": "red" }, { id: "2", category: "cat2", "question1": "blue", "question2": "blue" }, { id: "2", category: "cat2", "question1": "red", "question2": "blue" }],
    questions = new Set,
    result = Object.values(array.reduce((r, o) => {
        ['question1', 'question2'].forEach(question => {
            var key = [o.category, question].join('|');
            if (!questions.has(o[question])) {
                Object.values(r).forEach(p => p[o[question]] = 0);
                questions.add(o[question]);
            }
            r[key] = r[key] || Object.assign({ category: o.category, question }, ...Array.from(questions, q => ({ [q]: 0 })));
            r[key][o[question]]++;
        });
        return r;
    }, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...