@Alex_87

Как при прохождение цикла по объекту узнать, является ли свойством объекта другой объект?

Добрый вечер! Имеется код:
const data = {
  user: 'ubuntu',
  hosts: {
    0: {
      name: 'web1',
    },
    1: {
      name: 'web2',
      null: 3,
    },
  },
};

Можно ли дойдя с помощью цикла до свойства hosts понять, что оно является объектом?
Просто мне необходимо в этом случае, добавлять в тело цикла(или условия) после самого объекта(в данном случае data), или .объект или [свойство].
Кстати, с помощью какого метода, я смогу это всё добавлять? Мне нужно добавить либо data.hosts либо data[свойство]
  • Вопрос задан
  • 338 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
Можно ли дойдя с помощью цикла до свойства 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;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
john36allTa
@john36allTa
alien glow of a dirty mind
Не используйте typeof - массивы тоже объектами ей считаются
console.log(typeof([]))
//Object
console.log(Object.prototype.toString.call( { } ).indexOf('object Object') ==1)
//true
console.log(Object.prototype.toString.call( [ ] ).indexOf('object Object') ==1)
//False

Функция isObject:
const isObject = objRef => Object.prototype.toString.call( objRef ).indexOf('object Object') == 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы