Javascript: создание 2-мерного массива из массива объектов

#javascript #jquery #node.js #arrays

#javascript #jquery #node.js #массивы

Вопрос:

У меня есть следующий массив объектов, и я хочу получить из него 2d-массив. Что я пробовал до сих пор :

 let arr = [
  {
    "id": '1',
    "userId": '1',
    "postId": 1,
    "type": 'like'
  },
  {
    "id": '2',
    "userId": '1',
    "postId": 2,
    "type": 'like'
  },
  {
    "id": '3',
    "userId": '2',
    "postId": 3,
    "type": 'like'
  },
  {
    "id": '4',
    "userId": '2',
    "postId": 4,
    "type": 'dislike'
  },
  {
    "id": '5',
    "userId": '2',
    "postId": 1,
    "type": 'disklike'
  },
];

var newArr = arr.map(function(val, index){          
 return [val.type]
})
 

Это возвращает :

 [
    ["like"], ["like"], ["like"], ["dislike"], ["dislike"]
]
 

Это не ожидаемые результаты, ожидаемые результаты :

 [
    ["like", "like"], // User 1
    ["like", "dislike", "dislike"] // User 2
]
 

как пользователь с userId 1 двумя лайками, так и пользователь с userId 2 одним лайком и двумя антипатиями.

Чего мне здесь не хватает.

Комментарии:

1. Покажите нам, что вы уже пробовали, и мы исправим вашу работу. Но мы здесь не для написания вашего кода 😉

2. @marks Я обновил свой вопрос своим решением.

Ответ №1:

Вы можете использовать:

     const original = [
      {
        id: '1',
        userId: '1',
        postId: 1,
        type: 'like'
      },
      {
        id: '2',
        userId: '1',
        postId: 1,
        type: 'like'
      },
      {
        id: '3',
        userId: '2',
        postId: 3,
        type: 'like'
      }
    ];
    const newArray = original.reduce ((array, item) => {
      const index = parseInt(item.userId) - 1;
      array[index] = array[index] ?? [];
      array[index].push(item.type);
      return array;
    }, []);
    console.log(newArray); 

Комментарии:

1. Спасибо за ответ, он не создает 2d-массив, кстати

2. @Grammer не могли бы вы, пожалуйста, запустить код и сообщить мне, где он отличается от вашего желаемого результата?

3. да, немного отличается, см. Вопрос, ожидаемые результаты должны быть просто 2d-массивом, like и dislike , поскольку их всего два userId , и userId 1 они имеют два лайка и userId 2 имеют 1 лайк и 2 антипатии, я упомянул ожидаемый массив в конце вопроса, еще раз спасибо.

4. значение like должно быть равно 1, а значение dislike должно быть равно 0 в возвращаемом / ожидаемом массиве.

5. смотрите Обновленный вопрос, теперь он должен иметь больше смысла