【问题标题】:Finding value in json array and replacing it using Typscript [duplicate]在 json 数组中查找值并使用 Typescript 替换它 [重复]
【发布时间】:2021-01-09 21:22:43
【问题描述】:

我有一个包含 1000 行 json 行的文件,如下所示。我很难在数组中找到特定的键。 示例 json:

    {"connection":"98374"
     ,"db":"8",
     ,"timestamp":"159905411631"
     ,"event":"DataCatch"
     ,"data":[{"key":"ruleid","value":"111"}
             ,{"key":"responseid","value":"155-response-4"}
             ,{"key":"responsetype","value":"Capture"}
             ,{"key":"reason","value":"ClientVisit"}
             ,{"key":"subreason","value":""}
             ,{"key":"score","value":"0.00"} 
             ,{"key":"comment","value":""}]
    }

我需要能够在“数据”数组中找到“原因”键并将“值”替换为“测试”。 “data”数组并不总是出现在每个 json 行上,只有在“event”“dataCatch”存在时才会出现。

我可以将它解析为一个变量,但我只能将“数据”数组作为一个整体来调用。任何想法如何定位数组中的特定值?

在 Typescript 中遇到了一些麻烦。

【问题讨论】:

    标签: javascript arrays json typescript


    【解决方案1】:

    您需要像这样映射数据变量中的数据键。

    data.data = data.data.map((item) => {
      if (item.key === "reason") {
        item.value = "test";
      }
      return item;
    });
    

    数据键是一个值数组,所以你需要循环遍历它并将键属性的值与你要查找的值进行比较,如果匹配,则可以更新值属性

    https://codesandbox.io/s/angry-shirley-1gh83?file=/src/index.ts:666-782

    【讨论】:

      【解决方案2】:

      有很多方法可以解决这个问题,但这里有一个。

      首先,将您的 JSON 解析为对象数组。 数组的每个元素将如下所示:

      {
        connection: '98374',
        db: '8',
        timestamp: '159905411631'
        event: 'DataCatch',
        data: [
          { key: 'ruleid', value: '111' },
          { key: 'responseid', value: '155-response-4' },
          { key: 'responsetype', value: 'Capture' },
          { key: 'reason', value: 'ClientVisit' },
          { key: 'subreason', value: '' },
          { key: 'score', value: '0.00' },
          { key: 'comment', value: '' },
        ],
      }
      

      让我们调用我们的对象数组allData,以便我们稍后引用它。

      现在我们可以开始我们的“手术”了。 我们将从内到外进行工作,首先查看需要对元素的 data 数组中的特定条目执行什么操作。

      这里有一个函数可以满足我们的需要:

      function updateReason(entry) {
        if (entry.key === 'reason') {
          return { ...entry, value: 'test' };
        } else {
          return entry;
        }
      }
      

      此函数检查提供的条目是否有一个值为'reason'key,如果是,则返回一个与提供的条目相同的 条目,除了它的值为'test'

      我们如何使用它来更新整个data 数组(即在具有数据的条目中)? 我们只是将工作委托给我们亲爱的朋友map

      function updateData(data) {
        // or simply `data.map(updateEntry);`
        return data.map(entry => updateEntry(entry));
      }
      

      我们正在慢慢地“向外”工作。 更新我们的 allData 大数组(可能包含也可能不包含数据)中的整个条目怎么样?

      // I've called such an entry a "collection", because I already used the name
      // "entry" above :(
      // A "collection" is just an entry in the big `allData` array.
      function updateCollection(collection) {
        if (collection.event === 'DataCatch') {
          return {
             ...collection,                     // Leave everything else the way it is
             data: updateData(collection.data), // But update the `data` array
          };
        } else {
          return collection;
        }
      }
      

      如此接近。 我们需要做的最后一件事是将此转换应用于已解析的 allData 数组的每个元素:

      // or `allData.map(updateCollection);`
      const updatedData = allData.map(collection => updateCollection(collection));
      

      还有:

      问:改变条目不是更便宜吗?

      A:它会更便宜,但不会那么便宜很多,因为这里发生了大量的“结构共享”。我会推荐这种方法,除非您出于某种原因需要改变您的输入,或者性能要求需要它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-30
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2014-08-11
        • 1970-01-01
        • 2021-08-07
        相关资源
        最近更新 更多