Как я могу объединить массив объектов с одинаковыми ключами в ES6 javascript? - PullRequest
0 голосов
/ 29 мая 2018

Как я могу объединить два массива объектов, которые имеют разные пары ключей.Я был бы в порядке, чтобы использовать библиотеку или функции ES6.

const listOfQuestions = [{
  question1: {
    important: true
  }
}, {
  question2: {
    important: false
  }
}]

const listOfAnswers = [{
  question1: {
    answer: false
  }
}, {
  question2: {
    answer: true
  }
}]

Ожидаемый результат:

const result = [{
  "question1": {
    "important": true,
    "answer": false
  }
}, {
  "question2": {
    "important": false,
    "answer": true
  }
}]

Я пытался использовать синтаксис распространения:

const test = [...listOfQuestions, ...listOfAnswers]

Нотогда я получаю что-то очень из того, что мне было нужно:

[
  {
    "question1": {
      "important": true
    }
  }, {
    "question2": {
      "important": false
    }
  }, {
    "question1": {
      "answer": false
    }
  }, {
    "question2": {
      "answer": true
    }
  }
]

Ответы [ 5 ]

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

С этой структурой ужасно работать !!

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

const qMap = questions.reduce((m, q) => {
  const qKey = Object.keys(q)[0];
  return m.set(qKey, {[qKey]: Object.assign({}, q[qKey])});
}, new Map);

answers.forEach(a => {
  const qKey = Object.keys(a)[0];
  qMap.get(qKey) && Object.assign(qMap.get(qKey)[qKey], a[qKey]);
});

const res = [...qMap.values()];

console.log(res)
<script>
const questions = [{
  question1: {
    important: true
  }
}, {
  question2: {
    important: false
  }
}]

const answers = [{
  question1: {
    answer: false
  }
}, {
  question2: {
    answer: true
  }
}]
</script>
0 голосов
/ 30 мая 2018

Этого можно добиться, используя функцию .map() и возвращая вновь созданный массив, содержащий bool important, а также answer каждому question.

const Q = [{question1:{important: true}}, {question2:{important: false}}]
const A = [{question1:{answer: false}}, {question2:{answer: true}}]

let testArr = Q.map(function(q, i) {
  return {
    ['question' + (i + 1)]: {
      important: q['question' + (i + 1)].important,
      answer: A[i]['question' + (i + 1)].answer
    }
  }
}, this);

console.log(testArr)
0 голосов
/ 30 мая 2018

Получил очень интересный код в ответах.Я хотел бы отметить, что я также мог бы добиться результата, используя метод Лодаша .merge().

const result = _.merge(listOfQuestions, listOfAnswers)

const listOfQuestions = [{question1:{important: true}}, {question2:{important: false}}]
const listOfAnswers = [{question1:{answer: false}}, {question2:{answer: true}}]

const result = _.merge(listOfQuestions, listOfAnswers)
console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
0 голосов
/ 30 мая 2018

Хотя я согласен с комментарием Феликса в ОП, что структура данных не способствует этой операции, здесь приведен пример объединения этих двух массивов, в котором предполагается, что объект имеет только один ключ (то есть идентификатор вопроса) и что ответы массив всегда содержит элемент, соответствующий массиву вопросов:

// jshint esnext: true

const listOfQuestions = [{question1:{important: true}}, {question2:{important: false}}];
const listOfAnswers = [{question1:{answer: false}}, {question2:{answer: true}}];

const merged = listOfQuestions.map((item) => {
  const obj = {};
  const key = Object.keys(item)[0];
  const question = item[key];
  const answer = listOfAnswers.find((answer) => {
    const answerKey = Object.keys(answer)[0];
    return key === answerKey;
  })[key];
  
  obj[key] = {...question, ...answer};
  
  return obj;
});

console.log(merged);

Используется синтаксис расширения, но в целом это, вероятно, не лучший способ решения этой проблемы.

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

Вы можете собрать внутренние свойства каждого вопроса в объекте и отобразить новый объект только с одним вопросом в новом массиве.

const
    setHash = o => Object.entries(o).forEach(([k, v]) => Object.assign(hash[k] = hash[k] || {}, v));

var listOfQuestions = [{ question1: { important: true } }, { question2: { important: false } }],
    listOfAnswers = [{ question1: { answer: false } }, { question2: { answer: true } }],
    hash = Object.create(null),
    result;

listOfQuestions.forEach(setHash);
listOfAnswers.forEach(setHash);

result = Object.entries(hash).map(([k, v]) => ({ [k]: v }));

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