проверить имя свойства литерала объекта

У меня есть сокращенная функция для создания элемента, которая принимает имя тега и литерал объекта.

//create element
function $make(tag, parameters) {
    var o = document.createElement(t);
    if (p.style) o.style.cssText = p.style;
    if (p.class) o.className = p.class;
    if (p.text) o.textContent = p.text;
    return o;
}

Вы называете это достаточно просто:

var e = $make('div', {style: 'float: left', class: 'myClass', text: 'Some Text'});

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

var e = $make('a', {style: 'float: left', text: 'Google', ~href: 'https://www.google.com'});

Как я могу перебирать свойства литерала объекта и проверять, начинается ли имя самого свойства (не значение) с определенного символа или строки? Это вообще возможно? Если нет, что бы вы порекомендовали в качестве альтернативы?


person Cliff    schedule 25.01.2016    source источник
comment
Обратите внимание, что ваша функция просто принимает объект. Объект мог быть определен с использованием синтаксиса литерала объекта ({ ... }), или он мог быть определен каким-либо другим способом (например, new Object(), или это может быть какой-то тип Object). Литерал относится к тому, как объект лексически определяется в коде; он не имеет отношения к объекту после его создания.   -  person apsillers    schedule 25.01.2016
comment
@apsillers Хотя в данном случае это верно, это не всегда верно для других литералов в JS; пример: ("my string" instanceof String === false)   -  person ndugger    schedule 25.01.2016


Ответы (2)


Вместо for ... in я бы предложил использовать цикл forEach над функцией Object.keys. Это потому, что for ... in ищет цепочку прототипов (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#Iterating_over_own_properties_only).

var obj = {"style": 'float: left', "text": 'Google', "~href": 'https://www.google.com'};
Object.keys(obj).forEach((elm) => {
  console.log("Key=>Value : " + elm + "=>" + obj[elm]);
  if(elm.contains("~")) {
    console.log("Key: " + elm + " contains ~");
  }
});
person Neil Munro    schedule 25.01.2016
comment
Спасибо! И как мне вызвать значение текущего ключа, чтобы присвоить его атрибуту объекта? Это просто key.value? - person Cliff; 25.01.2016
comment
Обновлен ответ, чтобы показать, как можно получить доступ к свойству объекта внутри цикла forEach. - person Neil Munro; 25.01.2016

Вы можете использовать цикл for...in, чтобы получить каждый ключ в Object, а затем проверить наличие строки или символа.

В приведенном ниже примере я проверяю, начинается ли клавиша с символа «~».

for (const key in myObject) {
    if (key.indexOf('~') === 0) {
        // key contains '~' character
    }
}

вы также можете использовать регулярное выражение для сопоставления строки вместо использования indexOf

person ndugger    schedule 25.01.2016