【问题标题】:Changing the value of JSON object's key, changes other values also更改 JSON 对象键的值,也更改其他值
【发布时间】:2018-12-03 23:21:15
【问题描述】:

说明:已将 JSON 对象定义为全局变量。 var JSON_OBJECT = [];

[
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
]

JSON 对象 (JSON_OBJECT) 由函数构造:jsonCreator

function jsonCreator() {

var af_Array = [];
var Trend_Array = [];
var selectedUsers = ['123','859','235']

for (var i = 0; i < 1; i++) {
    var af_keys = {}
    af_keys.formula_type = i;
    af_keys.lag = i;
    af_Array.push(af_keys);
}

for (var j = 0; j < 1; j++) {
    var trends_keys = {}
    trends_keys.is_active = j;
    Trend_Array.push(trends_keys);
}


for (var indexUsers = 0; indexUsers < selectedUsers.length; indexUsers++) {
    var jsonObj = {};
    jsonObj.user_id = selectedUsers[indexUsers]['rowId'];
    jsonObj.AF = af_Array;
    jsonObj.Trend = Trend_Array;
    JSON_OBJECT.push(jsonObj);
}
};

问题说明:将formula_type的值更改为user_id:123

尝试以下代码

var currentUserID = '123';
var formulaType = 'FORMULA-1'

Object.keys(JSON_OBJECT).forEach(function(k) {
if (currentUserID == JSON_OBJECT[k]['user_id']) {
    JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
}
});

面临的问题: 上面的代码将formula_type 的值更改为user_id:123user_id:859

生成的 JSON

[
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 'FORMULA-1',
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 'FORMULA-1',
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
]

我们将不胜感激。

var JSON_OBJECT = [
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
];

var currentUserID = '123';
var formulaType = 'FORMULA-1'

Object.keys(JSON_OBJECT).forEach(function(k) {
  if (currentUserID == JSON_OBJECT[k]['user_id']) {
      JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
  }
});
console.log(JSON_OBJECT);

【问题讨论】:

  • 你能试试 data[0].AF[0].formula_type = "3";..哪里数据是 JSON
  • 你的代码工作见sn-p。现在有什么问题?
  • 这可能是JSON_OBJECT 创建方式的问题。这两个AF 值可能引用同一个数组,或者AF 数组中的元素引用同一个对象。当然,正确的 json 对象不应该发生这种情况,但是如果您自己创建这些对象,那么错误可能就在那里。
  • 是的,问题出在创作上。这一行:jsonObj.AF = af_Array; 不复制,它只是分配一个引用。所有AF 字段都引用相同的af_Array 对象。你需要做一个深拷贝。 Trend_Array 分配也是如此。
  • 如果您不确定如何进行深度复制,最简单的方法是与 json 字符串相互转换。即创建af_Array 时将其保存为字符串af_Array_str = JSON.stringify(af_Array),然后在创建对象时使用jsonObj.AF = JSON.parse(af_Array_str)

标签: javascript jquery json key-value


【解决方案1】:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
    
        var currentUserID = '123';
		var formulaType = 'FORMULA-1';
        
        var JSON_OBJECT = '[{    "user_id": "123",    "AF": [        {            "formula_type": 0,            "lag": 0        }    ],    "Trend": [        {            "is_active": 0        }    ]},{    "user_id": "859",    "AF": [        {            "formula_type": 0,            "lag": 0        }    ],    "Trend": [        {            "is_active": 0        }    ]}]';

        var obj = jQuery.parseJSON(JSON_OBJECT);
       // var obj1 = jQuery.parseJSON(JSON_OBJECT);
$.each(obj, function(k,value) {
  if(value.user_id == currentUserID){
    JSON_OBJECT.AF = formulaType;
    obj[k]['AF'][0]['formula_type'] = formulaType;
  }
})	
		var myJSON = JSON.stringify(obj);	
        console.log(myJSON)
  
});
</script>

【讨论】:

    【解决方案2】:

    尝试以下操作:

    if (JSON_OBJECT.length > 0) {
        JSON_OBJECT.forEach(function(obj, index) {
        if (obj.user_id == 123) {
            if (obj.hasOwnProperty('AF')) {
            obj.AF.forEach(function(obj, index) {
                if (obj.hasOwnProperty('formula_type')) {
                obj.formula_type = 'FORMULA-1';
              }
            });
            }
        }
    
      });
    }
    

    解释:这里JSON_OBJECT 是一个对象数组。所以我们需要先循环进入数组。

    JSFiddle

    【讨论】:

      【解决方案3】:

      下面的代码 sn-p 有效:

      var JSON_OBJECT = [
      {
          "user_id": "123",
          "AF": [
              {
                  "formula_type": 0,
                  "lag": 0
              }
          ],
          "Trend": [
              {
                  "is_active": 0
              }
          ]
      },
      {
          "user_id": "859",
          "AF": [
              {
                  "formula_type": 0,
                  "lag": 0
              }
          ],
          "Trend": [
              {
                  "is_active": 0
              }
          ]
      }
      ];
      
      var currentUserID = '123';
      var formulaType = 'FORMULA-1'
      
      Object.keys(JSON_OBJECT).forEach(function(k) {
        if (currentUserID == JSON_OBJECT[k]['user_id']) {
            JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
        }
      });
      console.log(JSON_OBJECT);

      祝你好运!

      【讨论】:

        【解决方案4】:

        使用数组 map() 方法:

        var jsonObj = [
        {
            "user_id": "123",
            "AF": [
                {
                    "formula_type": 0,
                    "lag": 0
                }
            ],
            "Trend": [
                {
                    "is_active": 0
                }
            ]
        },
        {
            "user_id": "859",
            "AF": [
                {
                    "formula_type": 0,
                    "lag": 0
                }
            ],
            "Trend": [
                {
                    "is_active": 0
                }
            ]
        }
        ];
        
        var currentUserID = '123';
        var formulaType = 'FORMULA-1';
        
        jsonObj.map(obj => {
          if (obj.user_id == currentUserID) {
            for (var i in obj["AF"]) {
              obj["AF"][i].formula_type = formulaType;
            }
          }
        });
        
        console.log(jsonObj);

        在循环中使用 JavaScript for ...:

        var jsonObj = [
        {
            "user_id": "123",
            "AF": [
                {
                    "formula_type": 0,
                    "lag": 0
                }
            ],
            "Trend": [
                {
                    "is_active": 0
                }
            ]
        },
        {
            "user_id": "859",
            "AF": [
                {
                    "formula_type": 0,
                    "lag": 0
                }
            ],
            "Trend": [
                {
                    "is_active": 0
                }
            ]
        }
        ];
        
        var currentUserID = '123';
        var formulaType = 'FORMULA-1';
        
        for (var i in jsonObj) {
          if (jsonObj[i]["user_id"] == currentUserID) {
            for (var j in jsonObj[i]["AF"]) {
              jsonObj[i]["AF"][j].formula_type = formulaType;
            }
          }
        }
        
        console.log(jsonObj);

        【讨论】:

          【解决方案5】:

          问题在于创建 JSON,jsonCreator()jsonObj.AF = af_Array; 行没有复制,它只是分配一个引用。

          找到解决方案,在@ccarton 的建议下,将 JSON_OBJECT 转换为字符串并解析回来。

          var currentUserID = '123';
          var formulaType = 'FORMULA-1'
          
          var JSON_OBJECT1 = JSON.stringify(JSON_OBJECT); 
          JSON_OBJECT = JSON.parse(JSON_OBJECT1)
          
          Object.keys(JSON_OBJECT).forEach(function(k) {
          if (currentUserID == JSON_OBJECT[k]['user_id']) {
              JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
          }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-25
            • 1970-01-01
            • 2017-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-19
            • 1970-01-01
            相关资源
            最近更新 更多