覆盖特定的 JSON 值,但保留未覆盖的值

Overwrite specific JSON values but keep the ones that aren't overwritten

提问人:Thomasino73 提问时间:8/31/2023 最后编辑:AmerllicAThomasino73 更新时间:9/1/2023 访问量:59

问:

我目前正在开发一个应用程序,我从 server-sent-events 接收数据。数据流在开始时发送一次所有内容,并仅更新需要更新的字段。我的问题是,如何保存原始JSON对象并仅更新更新的项目。

此时,所有项目都已更新。例如,如果我收到一个包含 2 个项目的标准 JSON 对象,并且我收到以下更新,则该对象如下所示 因此,该对象被空项目覆盖,因为它不存在。{color: "black", id: 0}{ id: 1 }{color: "", id: 1}

const [initialUserData, setInitialUserData] = useState({
  id: 1,
  name: 'Pol',
  color: 'black',
});

useEffect(() => {
  const unsubscribe = sse.subscribe('playerupdate', (d: any) => {
    const receivedData = d;
    const updatedUserData = { ...initialUserData, ...receivedData }; // Create a copy of initialUserData

    // Iterate over the keys in receivedData and update updatedUserData
    for (const key in receivedData) {
      if (receivedData.hasOwnProperty(key)) {
        updatedUserData[key] = receivedData[key];
        console.log(key);
      }
    }

    updateUserData(updatedUserData);

    if (updatedUserData.PlayerId > 0) {
      setSessionState(true);
    } else if (updatedUserData.PlayerId === 0) {
      setSessionState(false);
    }
  });

  return unsubscribe;
}, []);

我正在使用 ReactJs Context API,这对我来说是新的,但它似乎不是问题,因为它可以完美地更新。

react-native 覆盖

评论

0赞 AmerllicA 8/31/2023
我认为你因为缺乏JavaScript知识而受苦。
1赞 Thomasino73 8/31/2023
然后结束我的痛苦并给出建议

答:

1赞 AmerllicA 8/31/2023 #1

看看我的版本:

const [initialUserData, setInitialUserData] = useState({
  id: 1,
  name: 'Pol',
  color: 'black',
});

useEffect(() => {
  const unsubscribe = sse.subscribe('playerupdate', (receivedData: any) => {
    // Merge the receivedData into the initialUserData
    const updatedUserData = { ...initialUserData, ...receivedData };

    updateUserData(updatedUserData);

    setSessionState(updatedUserData.PlayerId > 0);
  });

  return unsubscribe;
}, []);

你不需要那个循环。我在 .当值为布尔值时,无需添加大量代码,您可以直接使用它们而不是使用 .for insetSessionStateif-then else

评论

0赞 Thomasino73 8/31/2023
感谢您的建议和问题编辑!流程如下。在收到实际数据之前,“initialUserData”就像一个占位符。此过程有效,实际数据显示在代码中,但一旦颜色项更新,所有内容都会被 initialUserData 占位符变量覆盖,但会随着更新而覆盖。实际数据已经消失,仅在 30 秒后更新。它们是保存此实际数据的一种方式,还是始终返回到占位符数据?
0赞 AmerllicA 8/31/2023
@ThomasDierickx,兄弟,你在说什么?实际数据来自API,好吧。然后,通过使用状态的 setter 函数,它将被替换为对占位符的合并,这意味着一些键将被更新。好吧,那为什么实际数据会消失呢?这 30 秒是什么?
0赞 Thomasino73 8/31/2023
实际数据已消失,因为它不断被 initialUserData 值覆盖
0赞 AmerllicA 8/31/2023
这是否覆盖了您的逻辑?还是无意中发生的?
0赞 Thomasino73 8/31/2023
不经意间。当我设置 SSE 流时,我收到 1 个对象,应该存储这个对象,从中我只接收更新,这些更新应该反映到最初收到的对象上。对象中未更新的项目应保留在那里,不会消失
-1赞 Thomasino73 9/1/2023 #2

我通过制作一个普通的 let 变量而不是 useState 并更新它一次来修复它。从那时起,updatedUserData 接收更新并将两个变量放在一起!

    let initialUserData = {
       id: 1,
      name: 'Pol',
      color: 'black'
    };

    useEffect(() => {
      const unsubscribe = sse.subscribe('playerupdate', (receivedData: any) => {
        if (receivedData.color === "white") {
          initialUserData = receivedData
        }

        const data = { ...initialUserData, ...receivedData };
        updateUserData(data);

        setSessionState(data.PlayerId > 0);
      return unsubscribe;
    }, []);