Есть ли способ получить значение и установить его для элемента в предоставленном ассоциативном массиве? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть сериализованная модель, которая является массивом объектов (ассоциативно?), И мне нужно получить и установить определенные поля внутри нее.

Я пытался выполнить итерацию через jQuery и js, но с некоторым ограниченным успехом, но могу получить только 1-й уровень ключей.

{
  "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,

}

Я хотел бы получить значение любой из пар ключ-значение и установить его. например Получите «BranchCode» с ID = 123 и «code» и установите поле «Code».

EDIT: Это работает. Следующий шаг - извлечь его в свой собственный массив, но это другой вопрос.

   $.each(serializedObject, function (key, value)
    {
        console.log("key= " + key + "   ." + value);
        if (key == 'Branch')
        {
            value.ID = 456;

            // Get this into a standalone array?
            // newArray
        }
    });

Спасибо

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете использовать метод 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';

Однако, если вы ориентируетесь на старые браузеры, вам понадобится полифилл для него. Согласно 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
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...