Как найти и заменить значение в JSON? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть такой объект:

{
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}

Мне нужно найти все ключи 'name' и заменить его значение, только если оно начинается с 'test name', а затем возвращает новый объект JSON:

{
  "responses": {
    "firstKey": {
      "items": {
        "name": "N/A"
      }
    },
    "anotherKey": {
      "items": {
        "name": "N/A"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}

Проблема в том, что ключи не согласованы в объектах, то есть 'firstKey', 'secondKey' ... Я пробовал ForEach, но он кажется слишком громоздким ... Поэтому мне нужен либо lodash, либо vanila JavaScript для замены ценности.

Ответы [ 4 ]

1 голос
/ 27 июня 2019

Объект javascript должен быть повторен, а затем каждое значение имени может быть проверено и заменено. Существуют проверки, такие как hasOwnProperty(), которые можно использовать, чтобы убедиться, что вы не выполняете итерации объектов, в которых отсутствуют «элементы» или «имя», для лучшей обработки ошибок.

var data = {
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
};

Учитывая приведенный выше JSON, вы можете использовать простой оператор for для итерации, а затем проверять каждое имя на некоторое значение и заменять.

for(var key in data.responses){
    if ((data.responses[key].items.name).match(/test name/)){
       data.responses[key].items.name = "N/A";
    } 
}

Для проверки замен вы можете войти data в консоль.

console.log(JSON.stringify(data));
0 голосов
/ 28 июня 2019

Объект javascript для всех намерений и целей является деревом - хотя это может быть и вполне может быть ориентированный граф - который вполне может быть циклическим означает, что узел в графе указывает на своего родителя.Следование циклу может привести к бесконечной рекурсии или циклу.

Вы хотите использовать что-то вроде traverse, чтобы делать то, о чем вы говорите.Он заботится обо всем, что мешает обходу графа - работе с циклами в графе и т. П.

const traverse = require('traverse');
. . .
var scrubbed = traverse(obj).map( function(value) {
  const isTestName = this.key === 'name'
    && value
    && /^test name/i.test(value)
    ;

  if (isTestName) {
    this.update('N/A');
  }

});

ПРИМЕЧАНИЕ: Функция обратного вызова, заданная для travese, не может быть функцией стрелки (() => {...}, поскольку контекст this этой функции является контекстом traverse для текущегопроверяемый узел.

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

0 голосов
/ 27 июня 2019

Это также можно сделать при разборе:

var json = `{
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
}`

var obj = JSON.parse(json, (k, v) => k == 'name' && /^test name/.test(v) ? 'N/A' : v)

console.log( obj )
0 голосов
/ 27 июня 2019

Сделай что-нибудь подобное. Преобразовать в строку заменить с помощью регулярного выражения (также добавьте ключ в регулярное выражение), а затем преобразовать обратно.


var data = {
  "responses": {
    "firstKey": {
      "items": {
        "name": "test name one"
      }
    },
    "anotherKey": {
      "items": {
        "name": "test name two"
      }
    },
    "oneMoreKey": {
      "items": {
        "name": "John"
      }
    }
  }
};

var originalMsg = JSON.stringify(data);
console.log(data)
console.log(originalMsg)
var updatedMsg = originalMsg.replace(/test name [a-z]*/g, "N/A");
console.log(updatedMsg)
var newObj = JSON.parse(updatedMsg); 
console.log(newObj);

...