【问题标题】:How can I set array as a key value in javascript object?如何将数组设置为 javascript 对象中的键值?
【发布时间】:2019-04-07 10:09:33
【问题描述】:

我正在尝试使用 javascript 将数组设置为 JSON 对象中的键值。

当我设置数组值时,

console.log(obj["likes"]) 显示大小为 1 的数组。

但在下一行 console.log(obj) 显示 likes 键是一个大小为 0 的数组。


我有一个 JSON 对象,其中包含有关帖子的信息。

如果帖子中不存在点赞,则该帖子的对象中不存在该字段。

我正在尝试实现一个喜欢-不喜欢的更新功能,我可以在其中检查用户是否喜欢某个帖子。

如果他没有,那么我将他的用户名附加到喜欢的数组中,否则我删除他的用户名。

userID 是我在脚本标记开头定义的全局变量。

如果我设置一个新字符串而不是用户 ID,它会起作用:

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

这也有效(我得到了一个额外的空间,但它至少可以正确记录):

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

但是再这样做是行不通的!!!!

let arr = [" "+userId]
console.log(arr)
arr[0] = arr[0].trim()
console.log(arr)
obj["likes"] = arr
console.log("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.log(userId)

                            obj["likes"] = [id]
                            console.log(obj["likes"])
                            console.log("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.log(obj["likes"])

                    renderData()
                    return
                }
        }
    }

【问题讨论】:

  • 是的。是一个错字。查看我最近的编辑...
  • 我只看了你说的“但是再做一次没有用!!!!”..我复制并粘贴了该代码,它按预期工作......最终的 obj 是数组数组,如下所示:obj["likes"][0]。所以你可以检查一下 obj["likes"][0] === arr[0] 是真的

标签: javascript html arrays json


【解决方案1】:

两个问题。 1. usrId - userId 错字 randomSoul 已经提到。 2.这一行:

likes = likes.push(userId)

likes.push(something)的输出是一个数字,push后数组的长度。该行将等于likes = 1。改为:

likes.push(userId)

【讨论】:

  • 感谢您指出这一点。这将是我必须调试的下一个错误。但这不是问题 rn 的根源。它下面的行是问题所在。我认为这是因为 userID 是一个全局变量。你能告诉我如何正确访问它吗?查看我编辑的帖子。
【解决方案2】:

push 返回数组的新长度 - 所以这一行:

likes = likes.push(userId);

将是一个数字,而不是一个数组 - 删除分配:

likes.push(userId);

【讨论】:

  • 嘿,感谢您指出这一点。但问题在于它下面的其他部分。我认为这是因为 userID 是在全局范围内定义的。
  • 我的意思是 userId 不是 userID
【解决方案3】:

原来我漏掉了一个括号。

但这仍然不能解释奇怪的行为,其中一行键值被设置,而下一行 console.log 的输出在访问 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.log("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.log("Obj:",obj)
                    }

                    if ("dislikes" in obj) {
                        var dislikes = obj["dislikes"]
                        console.log("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.log("ID: ",userId)
                        if (likes.includes(userId)) {
                            likes = likes.filter(id => id != userId)
                            obj["likes"] = likes
                        }
                    }
                }    
            }

                crawledUrlsData[i] = obj

                linkTreeRef.set(crawledUrlsData)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 2020-05-14
    • 2022-12-10
    • 2021-07-19
    相关资源
    最近更新 更多