JavaScript: получить все параметры объекта - PullRequest
4 голосов
/ 01 февраля 2011

У меня есть объект JS с переменным количеством параметров. Есть ли способ узнать, какие параметры были переданы именно в это время?

Пример:

function getElement() {
    var scope = document;

    this.by = function(data){
        if (data.id)    scope = scope.getElementById(data.id);
        if (data.tag)   scope = scope.getElementsByTagName(data.tag);       
        return scope;
    }
}

И я запускаю это так

var x = new getElement(); 
vad div = x.by({id : "chosenID"});

получает div с идентификатором chosenID

или

var x = new getElement(); 
vad inputs = x.by({id : "chosenID", tag : "input"});

получает все inputs в div с идентификатором chosenID;

Я хочу знать, передал ли я один или два параметра и какие.

Спасибо!

ps: Я ценю ваше время, помогая мне, но, пожалуйста, не предлагайте jQuery или другую среду JS, так как это только для целей обучения. Очень благодарен, Сорин.

Ответы [ 3 ]

5 голосов
/ 01 февраля 2011

Используйте цикл for … in для перебора параметров переданного объекта, например:

var prop;

for (prop in data) {
    if (data.hasOwnProperty(prop)) {
        // do something with data[prop]
    }
}

Не забудьте проверить собственность с hasOwnProperty.

1 голос
/ 01 февраля 2011

Есть много хороших общих ответов, однако учтите следующее:

Итак, вместо этого я рассмотрю некоторые конкретные случаи.Во-первых, я обычно начинаю с:

function f (x) {
  x = x || {} // so f() will be accepted as per f({})
  ...
}

Это также устанавливает контекст для следующего:

Мой обычный подход - просто проверить значение true-y.Истинное значение означает «поставлено».Однако этот недостаток заключается в том, что 0 или '' не считаются "поставленными".

if (x.id) {
   // x.id is any truth-y
}

Если 0 является допустимым входным сигналом, тогда я расширяю проверку, так что не undefined значения считаются "поставленными",Неустановленное свойство по умолчанию всегда имеет значение undefined.(Этот метод будет принимать все значения true-y и false-y, такие как 0, "" и null).

if (x.id !== undefined) {
   // x.id is all truth-y and all-but-undefined false-y
}

Если undefined является допустимым входом (, которыйЯ бы категорически против ), тогда проверка может основываться на hasOwnProperty.Это имеет тот недостаток, что не проверяет цепочку [[prototype]].

if (x.hasOwnProperty("id")) {
   // x.id set to something, including undefined
}

Конструкция for(..in..) также может использоваться для перебора свойств объекта (включая свойства в [[prototype]]).если они специально не спрятаны).Тем не менее, для общего случая работы с вводом (например, без создания библиотеки JSON), я считаю, что просто и чисто разобраться со свойствами входного объекта (объектов) одним из методов, описанных выше.

1 голос
/ 01 февраля 2011

Используя итерацию объекта (key in data) и объединение массивов ... вы можете вернуть несколько элементов ... хотя итерация объекта представляется довольно бесполезной с помощью оператора switch.

function getElement() {
    var scope = document;
    this.by = function(data){
        var key;
        var ret=[];
        for (key in data) {
          if(data.hasOwnProperty(key)) {
            switch(key) {
              case "id":
                ret=ret.concat(scope.getElementById(data[key]));
                break;
              case "tag":
                ret=ret.concat(scope.getElementsByTagName(data[key]));
                break;
              default:
                throw new Error("Unknown property "+key);
            }
          }
        }
        return ret;
    };
}
...