Замена значений в объекте JSON

У меня есть следующий объект JSON data вернулся из моего apicontroller:

> [  {"id":2,"text":"PROGRAMME","parent":null},
> {"id":3,"text":"STAGE","parent":2},
> {"id":4,"text":"INFRA","parent":2},
> {"id":5,"text":"SYSTEM","parent":3},
> {"id":6,"text":"STOCK","parent":3}, {"id":7,"text":"DPT","parent":3},
> {"id":9,"text":"EXTERNAL","parent":null}  ]

Я хочу заменить "parent":null с "parent":'"#"'

Я пробовал приведенный ниже код, но он заменяет только первое появление "parent":null, Как я могу заменить все "parent":null записи?

<script>
     $(document).ready(function () {
         $.ajax({
             url: "http://localhost:37994/api/EPStructures2/",
             type: "Get",
             success: function (data) {
                 var old = JSON.stringify(data).replace(null, "'#'"); //convert to JSON string
                 var new = JSON.parse(old); //convert back to array
             },
             error: function (msg) { alert(msg); }
         });
     });
</script>

Спасибо,

2 ответа

Решение

Вам нужно сделать замену глобальной:

var old = JSON.stringify(data).replace(/null/g, '"#"'); //convert to JSON string
var newArray = JSON.parse(old); //convert back to array

Таким образом, он будет продолжать заменять нули, пока не достигнет конца

Документы Regex:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

Кроме того, как примечание, вы должны избегать использования new как имя переменной, так как это зарезервированное слово в JavaScript, и большинство браузеров не позволяют вам использовать его

@JonathanCrowe ответ правильный для регулярных выражений, но это правильный выбор здесь? В частности, если у вас много элементов, вам будет гораздо лучше изменить разобранный объект, чем запускать его через JSON.stringify для регулярного выражения:

data.forEach(function(record) {
    if (record.parent === null) {
        record.parent = "#";
    }
});

Помимо того, что он быстрее, он не заменит другие нули, которые вы хотите сохранить, или не испортит запись вроде { text: "Denullification Program"},

Простой лайнер будет:

let json = JSON.parse(JSON.stringify(data).replace(/null/g, '"#"'));
Другие вопросы по тегам