Как я могу добавить sh в подмассив, сгруппировав сообщения в JS? - PullRequest
0 голосов
/ 12 марта 2020

Я не совсем уверен, как мне назвать этот вопрос, но я постараюсь объяснить мою проблему. На данный момент у меня есть массив в PHP с некоторыми записями.

Array
(
    [0] => stdClass Object
        (
            [sender_id] => 0
            [message] => Test
            [created_at] => 2020-03-12 16:26:23
        )

    [1] => stdClass Object
        (
            [sender_id] => 0
            [message] => Hello
            [created_at] => 2020-03-12 13:47:47
        )
)

Мне нужен был способ сгруппировать каждую запись по дате create_at, чтобы мой результат выглядел так:

Array
(
    [2020-03-12] => Array
        (
            [0] => stdClass Object
                (
                    [sender_id] => 0
                    [message] => Test
                    [created_at] => 2020-03-12 16:26:23
                )

            [1] => stdClass Object
                (
                    [sender_id] => 0
                    [message] => Hello
                    [created_at] => 2020-03-12 13:47:47
                )
        )

)

Чтобы достичь этого, я сделал это в PHP:

$grouped = [];

foreach ( $messages as $message ) {
    $created_at_date = date( 'Y-m-d', strtotime( $message->created_at ) );
    $grouped[ $created_at_date ][] = $message;
}

Но теперь у меня возникла проблема, поэтому я решил выполнить эту задачу в JS. Итак, сначала я закодировал массив в PHP и установил его в переменную внутри тега <script>:

<script>
    let messages = <?= ! empty( $messages ) ? json_encode( $messages ) : '[]' ?>;
</script>

Теперь у меня много сообщений, но они еще не сгруппированы. Поскольку мне нужно соблюдать часовой пояс, я могу сгруппировать их только в JS, где я знаю часовой пояс клиентов. Я уже сделал это с часовым поясом, но теперь не могу сгруппировать сообщения, как в PHP. Вот что я попробовал:

let messages = [ {
	sender_id: "0",
	message: "Test",
	created_at: "Thu Mar 12 2020 17:26:23 GMT+0100 (Mitteleuropäische Normalzeit)"
}, {
	sender_id: "0",
	message: "Hallo",
	created_at: "Thu Mar 12 2020 17:26:23 GMT+0100 (Mitteleuropäische Normalzeit)"
} ];

let groupedMessages = [];

jQuery( messages ).each( function ( index, message ) {
	let createdAtDate = new Date( message["created_at"] ).toLocaleDateString( navigator.language, {
		day: "2-digit",
		month: "2-digit",
		year: "numeric"
	} );
  
	groupedMessages[createdAtDate][] = message;
} );

console.log( groupedMessages );
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

1 Ответ

1 голос
/ 12 марта 2020

Я думаю, что вам не хватает:

jQuery( messages ).each( function ( index, message ) {
    let createdAtDate = new Date( message["created_at"] ).toLocaleDateString( navigator.language, {
        day: "2-digit",
        month: "2-digit",
        year: "numeric"
    } );

    if(typeof groupedMessages[createdAtDate] === 'undefined'){
        groupedMessages[createdAtDate] = [];
    }

    groupedMessages[createdAtDate].push(message);
} );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...