如何将内容推送到 JavaScript 中对象元素内的数组?
2023-06-22
86
我有以下对象:
var watchObject = {};
下面是我想完成的代码;如果它存在于对象中,我想将其附加,如果它不存在,我想创建一个新的键/值对。键值对看起来像“23”:[blah]。因此,如果对象中存在“23”(data.room),我将向其推送另一个,如“23”:[blah,bleh]。
//assume data.room is defined elsewhere and data.videoId is defined elsewhere
if (data.room in watchObject) {
watchObject[data.room].push(data.videoId);
} else {
watchObject[data.room] = data.videoId;
}
我尝试了上述操作,我认为它会起作用,但它一直说:
“TypeError:watchObject[data.room].push 不是函数”
我也尝试过将 data.room 分配给变量,但没有成功:
if (data.room in watchObject) {
let tempRoom = data.room;
watchObject.tempRoom.push(data.videoId);
//watchObject[data.room].push(data.videoId);
} else {
watchObject[data.room] = data.videoId;
}
我收到此错误:
"TypeError: Cannot read property 'push' of undefined"
3个回答
这是因为
watchObject[data.room]
是
blah
(即 videoId) 而不是
[blah]
(即 videoIds 数组],因此错误
push is not a function
因为字符串没有 push 方法。
你需要这个:
if(watchObject[data.room] == null) {
watchObject[data.room] = []
}
// now you can safely push to the array
watchObject[data.room].push(data.videoId)
Dusan Jovanov
2023-06-23
问题是,一旦您通过此代码创建条目...
watchObject[data.room] = data.videoId;
它 不是 一个数组,因此下次您尝试此代码时...
watchObject[data.room].push(data.videoId);
它将失败并出现您看到的错误。
这里的一个简单的选项是在推送之前延迟创建一个数组
const watchObject = {};
const arr = [{ room: "23", videoId: "blah" }, { room: "23", videoId: "bleh" }];
arr.forEach((data) => {
// create an empty array if it does not exist
watchObject[data.room] ??= [];
// now push
watchObject[data.room].push(data.videoId);
});
console.log(watchObject);
Phil
2023-06-23
您几乎完成了。但是您有一个错误。尝试以下操作:
let watchObject = {};
// Init `data`
if (watchObject[data.room]) {
watchObject[data.room].push(data.videoId);
} else {
watchObject[data.room] = [data.videoId]; // this is the line you need to change
}
此操作效果良好。
HighTopper
2023-06-23