簡體   English   中英

如何匹配來自兩個 JSON 文件的 id 鍵,然后用更改更新源 JSON

[英]How to match id key from two JSON files then update the source JSON with changes

這有點復雜,但我相信 stackoverflow 編碼天才會輕松掌握(菜鳥的榮譽)。 我有一個source.json文件和一個changes.json文件。 在更改文件中,我有更新、創建、刪除等的 CRUD 類型指令。這是我正在構建的節點中的命令行工具。

要更新播放列表條目,我必須將更改中的payload.id與原始文件中的 playlist.id 相匹配……然后我假設delete.json()是原始條目並改變更改。 為清楚起見,我只需要更新部分的幫助。 不確定如何在源和更改中匹配 id。 我在猜測.filter() 或.reduce()?

來源.json:

"playlists" : [
      {
        "id" : "1",
        "owner_id" : "2",
        "song_ids" : [
          "8",
          "32"
        ]
      }
]

更改.json:

"playlists": [{
            "action": "update",
            "payload": [{
                "id": "1",
                "owner_id": "2",
                "song_ids": [
                    "8"
                ]
            }]
        }

所需 output 寫入 output.json

"playlists" : [
      {
        "id" : "1",
        "owner_id" : "2",
        "song_ids" : [
          "8"
        ]
      }
]

到目前為止,我的代碼運行良好,但不知道如何將源 (playlist.id) 中的id與更改 (payload.id) 匹配,如果匹配,則從源中刪除記錄並替換為我的更改記錄。 我認為它需要只是if子句的update部分中的一個子例程,然后是 a.push()。 謝謝大家!

    // Stream in source file
    const data = JSON.parse(fs.readFileSync('./' + inputFile));

    // Stream in changes file
    const changes = JSON.parse(fs.readFileSync('./' + changesFile));

    for(const [table, actions] of Object.entries(changes)) {
        console.log([table]);
        if(!(table in data))continue;
        
        // iterate through inner CRUD directives and mutate payloads
        for(const actionDetail of actions) {
            if(actionDetail.action === 'create') {
                console.log('This is a CREATE entry');
                data[table].push(...actionDetail.payload);
            }

            if(actionDetail.action === 'delete') {
                console.log('This is a DELETE entry');
            }

            if(actionDetail.action === 'update') {
                console.log('This is a UPDATE entry');
                // const something = (is (source)payload.id === (changes)playlist.id) {
                //     if so, delete source entry and push new entry
                //     data[table].push(...actionDetail.payload);
                //}
            }

        }
    }
    fs.writeFileSync('output.json', JSON.stringify(data, null, 2));

如果我正確理解你的數據集並應用你想要改變你的初始數據 object 的事實,你可以這樣:

console.log('This is a UPDATE entry');
actionDetail.payload.forEach((payload) => {
  const index = data.playlists.findIndex(
    (playlist) => playlist.id === payload.id
  );
  if (index > -1) data.playlists[index] = payload;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM