Можно ли дойдя с помощью цикла до свойства hosts понять, что оно является объектом?
typeof()console.log(typeof({}));
// object
for (var key in data) {
if(typeof(data[key]) == "object") {
console.log (key + " is object");
}
}
Просто мне необходимо в этом случае, добавлять в тело цикла(или условия) после самого объекта(в данном случае data), или .объект или [свойство].
вообще не понял о чем вы говорите...
Кстати, с помощью какого метода, я смогу это всё добавлять? Мне нужно добавить либо data.hosts либо data[свойство]
добавлять ЧТО и добавлять КУДА??
и записи data.hosts либо data["hosts"]
равнозначны.
добавить в data.hosts еще один элемент?
см.
JavaScript: Как добавить новый элемент в объект?data["hosts"][2] = {name: 'web3'}
но тут возникает неудобство с определением
следующего номера ключа, т.к. это НЕ массив!
с массивом было бы проще.
data["hosts"][data["hosts"].length] = {name: 'web3'}
// или
data["hosts"].push( {name: 'web3'} );
Upd:
По мотивам комментариев:
Решение.... рекурсивная функция
const data = {
user: 'ubuntu',
hosts: {
0: {
name: 'web1',
},
1: {
name: 'web2',
null: 3,
},
},
};
// классически на if
function getIn(obj, parr) {
if(typeof(obj[parr[0]]) == "undefined") {
return null;
} else {
if(typeof(obj[parr[0]]) == "object") {
if(parr.length > 1) {
return getIn(obj[parr[0]], parr.slice(1))
} else {
return obj[parr[0]]
}
} else {
return obj[parr[0]];
}
}
}
// защита от дурака (когда некорректные параметры) + switch case
function getIn(obj, parr) {
if (
typeof(obj) != "object" ||
typeof(parr) != "object" ||
parr.length == "undefined" ||
parr.length == 0
) return null;
switch (typeof(obj[parr[0]])) {
case "undefined":
return null;
case "object":
return (parr.length > 1)? getIn(obj[parr[0]], parr.slice(1)):obj[parr[0]]
default:
return obj[parr[0]];
}
}
// еще короче
function getIn(obj, parr){
return !(
typeof(obj) != "object" ||
typeof(parr) != "object" ||
parr.length == "undefined" ||
parr.length == 0
)?
typeof(obj[parr[0]]) == "object" ?
(parr.length > 1)?
getIn(obj[parr[0]], parr.slice(1)):obj[parr[0]] :
obj[parr[0]] ?
obj[parr[0]]: null:
null
}
// и стрелочной функцией
const getIn = (obj, parr) => !(
typeof(obj) != "object" ||
typeof(parr) != "object" ||
parr.length == "undefined" ||
parr.length == 0
)?
typeof(obj[parr[0]]) == "object" ?
(parr.length > 1)? getIn(obj[parr[0]], parr.slice(1)):obj[parr[0]] :
obj[parr[0]] ? obj[parr[0]]:null :
null;
UPD2:
Решение без рекурсивного вызова
function getIn(obj, parr) {
let o = obj;
for(let i=0; i< parr.length; i++) {
o = o[parr[i]];
if(typeof(o)=="undefined") return null;
}
return o;
}