我有一个序列化模型,它是一个对象数组(关联的?),我需要获取并设置其中的特定字段。
我尝试使用jQuery和js对其进行迭代,但取得了一些有限的成功,但是只能获得第一级键。
{
"Branch": {
"ID": 123,
"Code": "xyz",
"FkRegionID": null,
"FkEntityPersonID": null,
"ParentID": null,
"Detail": null,
"Addresses": [],
"TelephoneNumbers": [],
"DeletedTelephoneNumbers": [],
"BankAccounts": [],
},
"ParentLookup": null,
"Address": {
"ID": 55,
"FkEntityPersonID": 27,
"FkEntityAddressTypeID": 1,
"Address1": null,
"Address2": null,
"Address3": null,
"Address4": null,
"FkCityID": null,
"PostalCode": null,
"CountryID": null,
"RegionID": null,
"AddressTypeDetail": null,
"CityDetail": null
},
"AddressCityLookup": null,
"Telephone": {
"ID": null,
"FkEntityPersonID": 27,
"FkTelephoneTypeID": 1,
"TelephoneNumber": 0826559999,
"TelephoneTypeDetail": null
},
"TelephoneTypeLookup": null,
}
我想获取任何键值对的值并进行设置。例如获取ID = 123的“ BranchCode”和“ code”,然后设置“ Code”字段。
编辑: 这可行。 下一步是将其提取到自己的数组中,但这是一个不同的问题。
$.each(serializedObject, function (key, value)
{
console.log("key= " + key + " ." + value);
if (key == 'Branch')
{
value.ID = 456;
// Get this into a standalone array?
// newArray
}
});
谢谢
答案 0 :(得分:0)
您可以使用Array.prototype.find(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)方法来查找所需的确切元素,然后可以对其进行修改。即
const yourArray = [...];
const targetElement = yourArray.find(function(el){
return el.Branch.ID === '123';
});
targetElement.Branch.code = 'new code';
但是,如果您要定位较旧的浏览器,则需要使用polyfill。根据MDN:
// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, 'find', {
value: function(predicate) {
// 1. Let O be ? ToObject(this value).
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1];
// 5. Let k be 0.
var k = 0;
// 6. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return kValue.
var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) {
return kValue;
}
// e. Increase k by 1.
k++;
}
// 7. Return undefined.
return undefined;
},
configurable: true,
writable: true
});
}