Получить повторяющееся значение ключа объекта и заменить / вернуть только одно значение из JSON - PullRequest
0 голосов
/ 05 мая 2020

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

ПРИМЕЧАНИЕ. Это возвращенные данные из результата JSON.

Пример ниже.

const obj = { id: 71, books: 'Things fall apart' }
{ id: 71, books: 'The Namesake' }
{ id: 71, books: 'The Secret Life of Bees' }
{ id: 417, books: 'The Namesake' }
{ id: 417, books: 'State of Wonder' }
{ id: 22, books: "Americanah" }
{ id: 22, books: 'Things fall apart' }

Что я хочу сохранить после Получение вышеуказанных данных

[
  {
    "id": 71,
    "books": [
      "Things fall apart",
      "The Namesake",
      "The Secret Life of Bees"
    ]
  },
  {
    "id": 417,
    "books": [
      "The Namesake",
      "State of Wonder"
    ]
  },
  {
    "id": 22,
    "books": [
      "Americanah",
      "Things fall apart"
    ]
  }
]

Спасибо, что помогли мне решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Вы можете попробовать это с помощью reduce и findIndex:

const arr = [
	{ id: 71, books: 'Things fall apart' },
	{ id: 71, books: 'The Namesake' },
	{ id: 71, books: 'The Secret Life of Bees' },
	{ id: 417, books: 'The Namesake' },
	{ id: 417, books: 'State of Wonder' },
	{ id: 22, books: "Americanah" },
	{ id: 22, books: 'Things fall apart' }
];

const res = arr.reduce((a, {id, books}) => {
    const index = a.findIndex(item => item.id === id);

    if (index === -1) {
	a.push({id, books: [books]});
    } else {
	a[index].books.push(books);
    }

    return a;
}, []);

console.log(res);
.as-console-wrapper{min-height: 100%!important; top: 0;}
0 голосов
/ 05 мая 2020

Вы имеете в виду, что obj - это массив? Лучше назвать его как-нибудь records. Кроме того, books следует называть book или bookName, поскольку это не массив!

В любом случае вы можете решить его, используя reduce и find как показано ниже:

const result = obj.reduce((accumulator, record) => {
    const { id, books } = record;
    const existingRecord = accumulator.find(storedRecord => storedRecord.id === id);
    if (existingRecord) {
        existingRecord.books.push(books);
    } else {
        accumulator.push({id, books: [books]});
    }
    return accumulator;
}, []);

console.log(result);
0 голосов
/ 05 мая 2020

Hi @ Stan50 добро пожаловать в Stack Overflow

      const arrayUnique = Array.from(
        obj
          .reduce(
            (acc, item) => (
              acc.set(item['id'], item)
            ),
            new Map()
          )
          .values()
      );


Метод reduce () выполняет функцию редуктора, которая выполняется для каждого элемента в массиве. У нас есть аккумулятор (a cc) и текущее значение (item). Возвращаемое значение наших функций-редукторов присваивается аккумулятору (в данном случае у нас есть initalValue и new Map (), поэтому оно будет первым при вызове обратного вызова), а затем мы устанавливаем (a cc .set (item [ 'id'], item) => для этого идентификатора мы устанавливаем текущий элемент), и этот аккумулятор запоминается на каждой итерации по всему массиву. Использование карты важно из-за сохранения порядка. И в конце вы используете Values, которые получают только объекты, и Array.from, которые создают массив из этих уникальных по идентификатору объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...