Object.keys
(если доступно в вашей среде). Он перечисляет ключи на текущем объекте, пропускает свойства прототипа и тому подобное.
Вы бы просто сделать:
function fill(obj) {
Object.keys(obj).forEach(function (key) {
obj[key] = true;
});
}
Если вы хотите получить действительно функциональный с ним, вы можете использовать сокращения и избежать побочных эффектов:
function fill(obj) {
return Object.keys(obj).reduce(function (p, key) {
p[key] = true;
return p;
}, {});
}
Если вы хотите сохранить тот же прототип в качестве исходного объекта, предполагая, что вы работаете с простыми типами, у которых нет конструкторов без аргументов (количество объектов и массивов), вы можете использовать obj.constructor
:
function fill(obj) {
return Object.keys(obj).reduce(function(p, key) {
p[key] = true;
return p;
}, new obj.constructor);
}
var filledObject = fill({
bar: false,
baz: 3,
boo: 'test'
});
var filledArray = fill([1, 2, 3, 4, false, 'test']);
document.getElementById('obj').textContent = JSON.stringify(filledObject);
document.getElementById('arr').textContent = JSON.stringify(filledArray);
var evilSparseArray = [1, 2, 3];
evilSparseArray[19] = 4;
document.getElementById('spa').textContent = JSON.stringify(fill(evilSparseArray));
<pre id="obj"></pre>
<pre id="arr"></pre>
<pre id="spa"></pre>
Обратите внимание, что это будет не корректно работают с редкими массивами, так как остальные ключи определены, но не имеют значимые данные.
Вы спрашиваете, как реализовать такую функцию без использования 'for' цикл? Или существует ли такой метод изначально? Это не. Во многих из этих случаев '.reduce' является вашим другом. –
Я бы сказал 'for (k in myObj) myObj [k] = true;', вероятно, самый простой, быстрый и сжатый способ сделать это, нет волшебной функции! – adeneo
Я думаю, что я спрашиваю, какой лучший функциональный способ сделать это. – jcuenod