jQuery .grep меняет исходный массив - PullRequest
0 голосов
/ 25 апреля 2020
В документации

jQuery .grep () четко указывается, что процесс не изменяет массив данных.

https://api.jquery.com/jquery.grep/

Следующий код находит совпадающее значение из того, что, я надеюсь, является исходным, постоянным массивом - arrLibrary.

Затем я изменяю результирующий комментарийObj ... но изменения, которые я делаю в нем, возвращаются в arrLibrary. Что, я полагаю, не противоречит документации jQuery GREP: мы создаем новый массив, подмножество оригинала, но он по-прежнему ссылается на оригинал, и поэтому сделанные в нем изменения возвращаются к оригиналу?

Чего мне не хватает? Как получить подмножество массива и затем обновить в нем данные , не испортив оригинал?

  var commentObj = [];   //  Will hold the updated object for inserting into page and saving to DB
  //  FIRST, find full object from arrLibrary

  if (source !== "chrome_logged"){
    commentObj = $.grep(arrLibrary, function(commie){ // just use arr
      return commie.uniqueID === obj.comment_id;
    });
    commentObj = commentObj[0];
  } else {
    commentObj = obj;   //  Just use what was passed
  }

Позже в своем коде я обновляю commentObj.fieldwhwhat = "this sucks" и соответствующий ключ / значение в обновлениях arrLibrary для соответствия.

Любая помощь / направление приветствуются.

1 Ответ

0 голосов
/ 26 апреля 2020

Это кажется мне сумасшедшим ... но я понимаю ... хотя grep не изменяет исходный массив - он приводит к подмножеству при совпадении - результирующее подмножество данных все еще ссылается к оригиналу.

Так что, если вы обновите результирующий массив, изменения оригинала тоже.

Так что я сделал глубокую копию, чтобы разорвать связь с оригиналом ...

var commentObj1 = [];   //  temp array - subset of arrLibrary...will still be connected to arrLibrary - reference
  //  FIRST, find full object from arrLibrary
  if (source !== "chrome_logged"){
    commentObj1 = $.grep(arrLibrary, function(commie){ // just use arr
      return commie.uniqueID === obj.comment_id;
    });
    commentObj1 = commentObj1[0];
  } else {
    commentObj1 = obj;   //  Just use what was passed
  }

  var commentObj = $.extend(true, {}, commentObj1); // deep copy - break reference to arrLibrary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...