开发者问题收集

如何将内容推送到 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);

请参阅 Nullish 合并分配 (??=)

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