Как добавить объекты в массив? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь добавить объекты в формате {title: value} в массив. Я написал следующую функцию

const newResults = resultData.map(result => {
  let results = [];
  if (result.INTELLCONT.length > 1) {
    for (let i = 0; i < result.INTELLCONT.length; i++) {
      results.push({
        title: result.INTELLCONT[i].TITLE._text,
      });
    }
  } else {
    results.push({
      title: result.INTELLCONT.TITLE._text,
    });
  }
  return results;
});

Но возвращаемый массив выглядит так

[Array(3), Array(1), Array(4), Array(1), Array(2), Array(1), Array(4)]

Я хочу, чтобы он выглядел следующим образом

[{title: value}, {title: value}, {title: value}, {title: value}, {title: value}, ... ]

Что такое Я делаю не так?

Ответы [ 4 ]

1 голос
/ 07 января 2020

используйте Array.reduce вместо Array.map, поскольку map возвращает одно значение для каждого элемента входного массива.

let accumulatorInitiator = []
const newResults = resultData.reduce((accumulator, result) => {;
  if (result.INTELLCONT.length > 1) {
    for (let i = 0; i < result.INTELLCONT.length; i++) {
      accumulator.push({
        title: result.INTELLCONT[i].TITLE._text,
      });
    }
  } else {
    accumulator.push({
      title: result.INTELLCONT.TITLE._text,
    });
  }
  return accumulator;
}, accumulatorInitiator);
1 голос
/ 07 января 2020

Как указано @ random , вы можете использовать add .flat после вызова .map, поскольку это создаст массив массивов, которые вы хотите сгладить after.


Кроме того, вы можете сделать это за один проход, просто добавив элементы в новый массив:

const resultData = [
  {INTELLCONT: [{TITLE: {"_text": "A"}}, {TITLE: {"_text": "B"}}, {TITLE: {"_text": "C"}}]},
  {INTELLCONT: [{TITLE: {"_text": "D"}}, {TITLE: {"_text": "E"}}, {TITLE: {"_text": "F"}}]},
  {INTELLCONT: [{TITLE: {"_text": "G"}}]},
  {INTELLCONT: [{TITLE: {"_text": "H"}}, {TITLE: {"_text": "I"}}, {TITLE: {"_text": "J"}}, {TITLE: {"_text": "K"}}]},
  {INTELLCONT: [{TITLE: {"_text": "L"}}]},
  {INTELLCONT: [{TITLE: {"_text": "M"}}, {TITLE: {"_text": "N"}}]},
  {INTELLCONT: [{TITLE: {"_text": "O"}}]},
  {INTELLCONT: [{TITLE: {"_text": "P"}}, {TITLE: {"_text": "Q"}}, {TITLE: {"_text": "R"}}, {TITLE: {"_text": "S"}}]},
];

const newResults = [];
resultData.forEach(result => {
  if (result.INTELLCONT.length > 1) {
    for (let i = 0; i < result.INTELLCONT.length; i++) {
      newResults.push({
        title: result.INTELLCONT[i].TITLE._text,
      });
    }
  } else {
    newResults.push({
      title: result.INTELLCONT[0].TITLE._text,
    });
  }
});

console.log(newResults);

Если resultData может быть повторен, вы можете упростить еще больше, используя .flatMap:

const resultData = [
  {INTELLCONT: [{TITLE: {"_text": "A"}}, {TITLE: {"_text": "B"}}, {TITLE: {"_text": "C"}}]},
  {INTELLCONT: [{TITLE: {"_text": "D"}}, {TITLE: {"_text": "E"}}, {TITLE: {"_text": "F"}}]},
  {INTELLCONT: [{TITLE: {"_text": "G"}}]},
  {INTELLCONT: [{TITLE: {"_text": "H"}}, {TITLE: {"_text": "I"}}, {TITLE: {"_text": "J"}}, {TITLE: {"_text": "K"}}]},
  {INTELLCONT: [{TITLE: {"_text": "L"}}]},
  {INTELLCONT: [{TITLE: {"_text": "M"}}, {TITLE: {"_text": "N"}}]},
  {INTELLCONT: [{TITLE: {"_text": "O"}}]},
  {INTELLCONT: [{TITLE: {"_text": "P"}}, {TITLE: {"_text": "Q"}}, {TITLE: {"_text": "R"}}, {TITLE: {"_text": "S"}}]},
];

const newResults = resultData.flatMap(result => result.INTELLCONT.map(r => ({title: r.TITLE._text})));

console.log(newResults)

В качестве альтернативы:

const resultData = [
  {INTELLCONT: [{TITLE: {"_text": "A"}}, {TITLE: {"_text": "B"}}, {TITLE: {"_text": "C"}}]},
  {INTELLCONT: [{TITLE: {"_text": "D"}}, {TITLE: {"_text": "E"}}, {TITLE: {"_text": "F"}}]},
  {INTELLCONT: [{TITLE: {"_text": "G"}}]},
  {INTELLCONT: [{TITLE: {"_text": "H"}}, {TITLE: {"_text": "I"}}, {TITLE: {"_text": "J"}}, {TITLE: {"_text": "K"}}]},
  {INTELLCONT: [{TITLE: {"_text": "L"}}]},
  {INTELLCONT: [{TITLE: {"_text": "M"}}, {TITLE: {"_text": "N"}}]},
  {INTELLCONT: [{TITLE: {"_text": "O"}}]},
  {INTELLCONT: [{TITLE: {"_text": "P"}}, {TITLE: {"_text": "Q"}}, {TITLE: {"_text": "R"}}, {TITLE: {"_text": "S"}}]},
];

const newResults2 = resultData.flatMap(result => result.INTELLCONT).map(r => ({title: r.TITLE._text}));

console.log(newResults2)
1 голос
/ 07 января 2020

проблема в том, что вы используете Map , и согласно документации

map вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве, по порядку, и Создает новый массив из результатов

, поэтому в основном вы делаете:

let results = [];
.....
return results

и, следовательно, каждая запись вашего массива будет преобразована (сопоставлена) в массив.

, чтобы решить эту проблему, вы можете использовать Flat , чтобы получить то, что вы хотите.

const newResults = resultData.map(result => {
  let results = [];
  if (result.INTELLCONT.length > 1) {
    for (let i = 0; i < result.INTELLCONT.length; i++) {
      results.push({
        title: result.INTELLCONT[i].TITLE._text,
      });
    }
  } else {
    results.push({
      title: result.INTELLCONT.TITLE._text,
    });
  }
  return results;
})
.flat();
1 голос
/ 07 января 2020

С картой вы помещаете массив в каждый индекс. Так что работает как положено. Используйте вместо карты уменьшение, так что вы просто поместите sh в один массив, и вам не нужно будет выполнять дополнительную работу для его выравнивания.

const newResults = resultData.reduce((results, result) => {
  if (result.INTELLCONT.length > 1) {
    for (let i = 0; i < result.INTELLCONT.length; i++) {
      results.push({
        title: result.INTELLCONT[i].TITLE._text,
      });
    }
  } else {
    results.push({
      title: result.INTELLCONT.TITLE._text,
    });
  }
  return results;
}, []);
...