【问题标题】:How to change a nested value in a dictionary as an upper level key如何将字典中的嵌套值更改为上层键
【发布时间】:2019-03-28 04:32:04
【问题描述】:

我有一个特定格式的 json 文件,但我想将其更改为我需要选取其中一个嵌套值并将它们投影为上层键的格式

我仅尝试了 stackoverflow 的建议,并且厌倦了达到特定的嵌套值,但我无法将其提升。

data = open('sampleDemo.json','r')
json_decode=json.load(data)
for item in data:
    mydict={}
    mydict['spk1'] = item.get('audioResponse').get('startTime').get('emotion').get.....
    print mydict

想要的输出:

输入文件如下所示:

{
   "audioResponse": [

  {
     "speaker":"spk1",
     "startTime": "0.0",
     "endTime": "15.239",
     "emotion": "neutral",
     "emotionScore": "0"
  },

  {
     "speaker":"silence",
     "startTime": "15.240",
     "endTime": "16.900",
     "emotion": "NA",
     "emotionScore": "NA"
  },

  {
     "speaker":"spk2",
     "startTime": "16.932",
     "endTime": "27.320",
     "emotion": "happy",
     "emotionScore": "2"
  },

  {
     "speaker":"spk1",
     "startTime": "27.977",
     "endTime": "37.900",
     "emotion": "anger",
     "emotionScore": "-3"
  } 
]}

【问题讨论】:

    标签: javascript json dictionary


    【解决方案1】:

    var data = {
      "audioResponse": [{
          "speaker": "spk1",
          "startTime": "0.0",
          "endTime": "15.239",
          "emotion": "neutral",
          "emotionScore": "0"
        }, {
          "speaker": "silence",
          "startTime": "15.240",
          "endTime": "16.900",
          "emotion": "NA",
          "emotionScore": "NA"
        }, {
          "speaker": "spk2",
          "startTime": "16.932",
          "endTime": "27.320",
          "emotion": "happy",
          "emotionScore": "2"
        }, {
          "speaker": "spk1",
          "startTime": "27.977",
          "endTime": "37.900",
          "emotion": "anger",
          "emotionScore": "-3"
        }]
    };
    
    var result = {
      audioResponse: []
    };
    
    for (var item of data.audioResponse) {
      var existed = result.audioResponse.find(x => x[item.speaker]);
      if (!existed)
        result.audioResponse.push({
          [item.speaker]: []
        });
    
      existedArray = result.audioResponse.find(x => x[item.speaker])[item.speaker];
    
      var copy = {...item};
      delete copy.speaker;
      existedArray.push(copy);
    }
    
    console.log(result);

    【讨论】:

      【解决方案2】:
      var inputList = {
         "audioResponse": [
      
        {
           "speaker":"spk1",
           "startTime": "0.0",
           "endTime": "15.239",
           "emotion": "neutral",
           "emotionScore": "0"
        },
      
        {
           "speaker":"silence",
           "startTime": "15.240",
           "endTime": "16.900",
           "emotion": "NA",
           "emotionScore": "NA"
        },
      
        {
           "speaker":"spk2",
           "startTime": "16.932",
           "endTime": "27.320",
           "emotion": "happy",
           "emotionScore": "2"
        },
      
        {
           "speaker":"spk1",
           "startTime": "27.977",
           "endTime": "37.900",
           "emotion": "anger",
           "emotionScore": "-3"
        } 
      ]}
      
      
      
      
      var result = inputList.audioResponse.reduce((acc, {speaker, ...rest})=>{
          acc['audioResponse'][speaker] = (acc['audioResponse'][speaker]) || [];
          acc['audioResponse'][speaker].push(rest);
          return acc;
      }, {audioResponse:{}});
      
      console.log(result);
      

      您可以使用reduce 方法。希望对你有帮助!

      【讨论】:

        【解决方案3】:

        但我想将其更改为我需要选取其中一个嵌套值并将它们投影为上层键的格式

        您可以将组形成的属性设置为动态

        'use strict';
        
        let attribute = 'speaker'; // can be 'speaker' or 'emotion' or 'emotionScore'
        let output = {
          audioResponse: []
        };
        
        for (let response of data.audioResponse) {
          let groupKey = response[attribute];
          let group = output.audioResponse[groupKey];
          delete response[attribute]; //remove the key
          if (group) {
            group.push(response);
          } else {
            group = [response];
          }
          output.audioResponse[groupKey] = group;
        }
        
        console.log(output);
        

        【讨论】:

          猜你喜欢
          • 2021-04-14
          • 2018-05-23
          • 2021-07-29
          • 2022-06-13
          • 2019-07-15
          • 1970-01-01
          • 2018-12-01
          • 1970-01-01
          • 2016-01-11
          相关资源
          最近更新 更多