Как я могу автоматически заменить значение поля документа JSON со значением & ldquo; @ nil & rdquo ;: & ldquo; true & rdquo; используя старый простой JavaScript? [Дубликат]

Разделитель «{{...}}" может также использоваться в строках:

"http://{{ app.request.host }}"
5
задан user1371896 6 May 2012 в 15:24
поделиться

4 ответа

Я сделал jsfiddle , который пересекает каждый объект, массив и значение в объекте JS, например ...

function scan(obj)
{
    var k;
    if (obj instanceof Object) {
        for (k in obj){
            if (obj.hasOwnProperty(k)){
                //recursive call to scan property
                scan( obj[k] );  
            }                
        }
    } else {
        //not an Object so obj[k] here is a value
    };

};

Я не получаю ошибку рекурсии (в Chrome ). Можете ли вы использовать это, чтобы делать то, что хотите?

Если вам нужно проверить, используется ли объект в массиве if (obj instanceof Array)

Чтобы проверить, обладает ли объект свойством "entity" use if (obj.hasOwnProperty('entity'))

Чтобы добавить (или изменить существующее) свойство «entity», используйте obj.entity = value или obj['entity'] = value

16
ответ дан El Ronnoco 21 August 2018 в 15:11
поделиться
  • 1
    Я ответил на это на своем iPhone, поэтому, если кто-то может исправить мое форматирование, я был бы очень благодарен !!! – El Ronnoco 5 May 2012 в 09:22
  • 2
    его отображение ошибки, если не определено для If (h.hasOwnProperty (k)) – user1371896 5 May 2012 в 09:24
  • 3
    Ах, вы можете начать тестирование «if (h instanceof object)» перед входом в цикл. – El Ronnoco 5 May 2012 в 09:30
  • 4
    no ,,, это ws формат ur кода ... Я был в большой букве .. Теперь он предупреждает компанию первого лица, а затем показывает «слишком много рекурсии». для getEntities (h [k]); – user1371896 5 May 2012 в 09:32
  • 5
    Выражение "stop" это тот, который я использовал в своем ответе: if ( ({}).toString.apply( prop ) === '[object Object]' ) {. Btw, Object.keys возвращает массив перечислимых свойств, поэтому нет необходимости использовать hasOwnProperty. – Florian Margaine 5 May 2012 в 10:09
(function recur( obj ) {
    Object.keys( obj ).forEach( function( prop ) {
        // Check if the property is an object
        if ( ({}).toString.apply( prop ) === '[object Object]' ) {
            // If it is, recall this function
            recur( prop );
        }
    } );
} () );

Я не добавил вашу логику, но вы поняли, как рекурсивно пройти ваш объект.

1
ответ дан Florian Margaine 21 August 2018 в 15:11
поделиться
  • 1
    lemme дать это попробовать ... даст u обратной связи, что .. – user1371896 5 May 2012 в 08:56
  • 2
    как добавить значение subobj здесь для приведенного выше примера? – user1371896 5 May 2012 в 08:57
  • 3
    Какие? Я не понимаю ваш комментарий. – Florian Margaine 5 May 2012 в 08:58
  • 4
    Я не понял, что такое пригород. – user1371896 5 May 2012 в 09:04
  • 5
    К сожалению, правильно отредактировал мой ответ. subobj является свойством объекта, что является объектом, поэтому вы можете его также перемещать. – Florian Margaine 5 May 2012 в 09:04

Вот функция, которую я часто использую. Это легко модифицировать для выполнения многих рекурсивных задач. Например, если вы добавляете флаг залога, вы можете быстро получить стек или добавить функцию обратного вызова, что делает ее еще более общей. Во всяком случае, это мои 2 цента

var recursiveObjMap = (function(){
  var stack = [];
  var result = [];
  // var bail = false;
  return function map(data, key){
    if (!$.isArray(data) && !$.isPlainObject(data) ) { 
      result.push(data);
      return false 
    }

    $.each(data, function(i, v){
      if (key) stack.push(key);
      map(v, i);
      stack.pop();
    });
    return result;
  };
})();

recursiveObjMap({a:'b',c:{d:{e:"f"}}}) // ['b', 'f']
1
ответ дан James Harrington 21 August 2018 в 15:11
поделиться

Скажем, у меня есть структура, подобная следующей:

var aObject = {
    items: [],
    children: {}
}

Дети - ассоциативный массив, содержащий больше aObjects. Таким образом, это может выглядеть так:

var aObject = {
    items: [],
    children: {
        "subgroup1": {
            items: [],
            children: {}
        },
        "subgroup2": {
            items: [],
            children: {}
        }
    }
}

У меня есть элемент, который содержит массив подгрупп:

["subgroup1", "subgroup1a"]

Каждая подгруппа - это «местоположение». Элемент должен быть размещен по адресу:

aObject.children[array[0]].children[array[1]].items

На каждом уровне мы должны проверить, существуют ли дети [array [i]], а если нет, создайте его. Вы не можете просто написать aObject.children [array [0]]. Children [array [1]]. Items.push (item), потому что дети [array [0]] могут и не существовать, и мы получим ошибку.

Это можно решить с помощью рекурсии! (AngularJS)

function recursive(aLevel, aItem, aArray, aIndex){
    var lLevel = aLevel;

    // If we have reached the end of the array
    if (aIndex === aArray.length){
        // Insert
        aLevel.items.push(aItem);
    } else {

        // If the subgroup doesn't exist, create it
        if (typeof aLevel.children[aArray[aIndex]] === 'undefined'){
            aLevel.children[aArray[aIndex]] = {
              items: [],
              children: {}
            };
        }

        // Move into
        recursive(aLevel.children[aArray[aIndex]], aItem, aArray, aIndex+1);
    }
}

aObject = {
    items: [],
    children: {},
}

angular.forEach(items, function(item, i){
    var location = item.location;

    if (location.length == 0){
        aObject.items.push(item);
    } else {
        recursive(aObject, item, location, 0);
    }
});

Окончательный объект aObject будет выглядеть следующим образом:

var aObject = {
     items: [],
     children: {
        "subgroup1": {
            items: [],
            children: {
                "subgroup1a": {
                    items: [item],
                    children: {}
                }
            }
        },
        "subgroup2": {
            items: [],
            children: {}
        }
    }
}
1
ответ дан Sam Whillance 21 August 2018 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: