Разделитель «{{...}}" может также использоваться в строках:
"http://{{ app.request.host }}"
Я сделал 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
(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 );
}
} );
} () );
Я не добавил вашу логику, но вы поняли, как рекурсивно пройти ваш объект.
subobj
является свойством объекта, что является i> объектом, поэтому вы можете его также перемещать.
– 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']
Скажем, у меня есть структура, подобная следующей:
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: {}
}
}
}
if ( ({}).toString.apply( prop ) === '[object Object]' ) {
. Btw,Object.keys
возвращает массив перечислимых свойств, поэтому нет необходимости использоватьhasOwnProperty
. – Florian Margaine 5 May 2012 в 10:09