Как установить массив в качестве значения ключа в объекте javascript?

Я пытаюсь установить массив в качестве значения ключа в объекте JSON, используя javascript.

Когда я устанавливаю значение массива,

console.info(obj["likes"]) отображает массив размером 1.

но на следующей строке console.info(obj) показывает, что ключ лайков представляет собой массив размера 0.


У меня есть объект JSON с информацией о сообщениях.

Если в сообщении нет лайков, то это поле не существует в объектах этого сообщения.

Я пытаюсь реализовать функцию обновления «нравится-не нравится», где я проверяю, понравился ли пользователю пост.

Если он этого не сделал, я добавляю его имя пользователя в массив лайков, иначе я удаляю его имя пользователя.

userID — это глобальная переменная, которую я определяю в начале тега script.

Это работает, если вместо userID я устанавливаю новую строку, например:

obj["likes"] = ["XX"]

Это тоже работает (я получаю дополнительное пространство, но, по крайней мере, оно правильно регистрируется):

obj["likes"] = [userId+" "]
console.info(obj["likes"])
console.info("Obj:",obj)

Но потом сделать это снова не получится!!!!

let arr = [" "+userId]
console.info(arr)
arr[0] = arr[0].trim()
console.info(arr)
obj["likes"] = arr
console.info("Obj:",obj)
function saveLikeDislike(url, action) {
        for (i = 0; i < crawledUrlsData.length; i += 1) {

            if (typeof crawledUrlsData[i] === "object") {

                var obj = crawledUrlsData[i]

                if (url === obj["url"]) {

                    if (action === "like") {

                        if ("likes" in obj) {
                            likes = obj["likes"]
                            if (likes.includes(userId)) {
                                likes = likes.filter(id => id != userId)
                            } else {
                                likes.push(userId)
                            }
                            obj["likes"] = likes
                        } else {
                            var id = window.userId
                            console.info(userId)

                            obj["likes"] = [id]
                            console.info(obj["likes"])
                            console.info("Obj:",obj)
                        }

                        if ("dislikes" in obj) {
                            var dislikes = obj["dislikes"]

                            if (dislikes.includes(userId)) {
                                dislikes = dislikes.filter(id => id != userId)
                                obj["dislikes"] = dislikes
                            }
                        }

                    } else {

                        if ("dislikes" in obj) {
                            dislikes = obj["dislikes"]
                            if (dislikes.includes(userId)) {
                                dislikes = dislikes.filter(id => id != userId)
                            } else {
                                dislikes.push(userId)
                            }
                            obj["dislikes"] = dislikes
                        } else 
                            obj["dislikes"] = [dislikes]
                        }

                        if ("likes" in obj) {
                            var likes = obj["likes"]

                            if (likes.includes(userId)) {
                                likes = likes.filter(id => id != userId)
                                obj["likes"] = likes
                            }
                        }
                    }

                    crawledUrlsData[i] = obj
                    console.info(obj["likes"])

                    renderData()
                    return
                }
        }
    }

Как установить массив в качестве значения ключа в объекте javascript?

да да. Была опечатка. Смотрите мою недавнюю правку...

Parth Tamane 07.04.2019 12:15

Я только посмотрел на то, где вы сказали: «Но тогда повторение этого не работает !!!!».. Я скопировал и вставил этот код, и он работает, как и ожидалось... окончательный obj представляет собой массив массивов, например: obj ["нравится"][0]. Итак, вы можете проверить, что obj["likes"][0] === arr[0] и это будет правдой

LFLFM 08.04.2019 11:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
112
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Две проблемы. 1. Опечатка usrId - userId, упомянутая randomSoul. 2. Эта строка:

likes = likes.push(userId)

Результатом likes.push(something) является число, длина массива после нажатия. Эта строка будет равна likes = 1. Сделайте вместо этого:

likes.push(userId)

Спасибо что подметил это. Это будет следующая ошибка, которую мне придется отлаживать. Но это не источник проблемы рН. Строки ниже — вот в чем проблема. Я думаю, это происходит потому, что userID является глобальной переменной. Не подскажете, как правильно к нему попасть? Смотрите мой отредактированный пост.

Parth Tamane 07.04.2019 12:20

push возвращает новую длину массива, поэтому эта строка:

likes = likes.push(userId);

Будет число, а не массив — убрать присваивание:

likes.push(userId);

эй, спасибо, что указали на это. Но проблема в другой части под ним. Я думаю, что это происходит, поскольку идентификатор пользователя определяется в глобальной области видимости.

Parth Tamane 07.04.2019 12:22

Я имею в виду идентификатор пользователя, а не идентификатор пользователя

Parth Tamane 07.04.2019 12:43
Ответ принят как подходящий

Оказывается, я пропустил скобку.

Но это по-прежнему не объясняет странное поведение, когда в одной строке было установлено значение ключа, а в самой следующей строке вывод из console.info был другим при доступе к userId, но правильным, если userId каким-то образом был изменен.

Во всяком случае, вот фиксированная функция:

function saveLikeDislike(url, action) {
    for (i = 0; i < crawledUrlsData.length; i += 1) {

        if (typeof crawledUrlsData[i] === "object" && crawledUrlsData[i]["url"] == url) {

            var obj = crawledUrlsData[i]

            if (url === obj["url"]) {

                if (action === "like") {

                    if ("likes" in obj) {
                        console.info("likes in obj")
                        likes = obj["likes"]
                        if (likes.includes(userId)) {
                            likes = likes.filter(id => id != userId)
                        } else {
                            likes.push(userId)
                        }
                        obj["likes"] = likes
                    } else {

                        obj.likes = [userId]
                        console.info("Obj:",obj)
                    }

                    if ("dislikes" in obj) {
                        var dislikes = obj["dislikes"]
                        console.info("Dislikes: ",dislikes)
                        if (dislikes.includes(userId)) {
                            dislikes = dislikes.filter(id => id != userId)
                            obj["dislikes"] = dislikes
                        }
                    }

                } else if (action === "dislike"){

                    if ("dislikes" in obj) {
                        dislikes = obj["dislikes"]
                        if (dislikes.includes(userId)) {
                            dislikes = dislikes.filter(id => id != userId)
                        } else {
                            dislikes.push(userId)
                        }
                        obj["dislikes"] = dislikes
                    } else {
                        obj["dislikes"] = [userId]
                    }
                    if ("likes" in obj) {
                        var likes = obj["likes"]
                        console.info("ID: ",userId)
                        if (likes.includes(userId)) {
                            likes = likes.filter(id => id != userId)
                            obj["likes"] = likes
                        }
                    }
                }    
            }

                crawledUrlsData[i] = obj

                linkTreeRef.set(crawledUrlsData)
        }
    }
}

Другие вопросы по теме