Javascript 函数JS设置对象上的所有属性
我有一个对象Javascript 函数JS设置对象上的所有属性,javascript,functional-programming,Javascript,Functional Programming,我有一个对象myObj像: { 0: true, 1: false, 2: false } 要将每个值设置为true,我可以使用一个循环: for (i in myObj) { myObj[i] = true } 但是在javascript中有没有一种功能性的方法来实现这一点呢?比如: myOjb.fill(true) 您需要(如果在您的环境中可用)。它枚举当前对象上的键,跳过原型属性等 您只需执行以下操作: function fill(obj) { Object.ke
myObj
像:
{
0: true,
1: false,
2: false
}
要将每个值设置为true
,我可以使用一个循环:
for (i in myObj) {
myObj[i] = true
}
但是在javascript中有没有一种功能性的方法来实现这一点呢?比如:
myOjb.fill(true)
您需要(如果在您的环境中可用)。它枚举当前对象上的键,跳过原型属性等
您只需执行以下操作:
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
如下:
{
0: true,
1: false,
2: false
}
功能填充(obj){
返回Object.keys(obj).reduce(函数(p,key){
p[键]=真;
返回p;
},新的对象构造函数);
}
var filledObject=fill({
酒吧:错,
巴兹:3,,
嘘:“测试”
});
var filledaray=fill([1,2,3,4,false,'test']);
document.getElementById('obj').textContent=JSON.stringify(filledObject);
document.getElementById('arr').textContent=JSON.stringify(filledArray);
var=[1,2,3];
雷[19]=4;
document.getElementById('spa').textContent=JSON.stringify(fill(searray))代码>
您想要的(如果在您的环境中可用)。它枚举当前对象上的键,跳过原型属性等
您只需执行以下操作:
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
如下:
{
0: true,
1: false,
2: false
}
功能填充(obj){
返回Object.keys(obj).reduce(函数(p,key){
p[键]=真;
返回p;
},新的对象构造函数);
}
var filledObject=fill({
酒吧:错,
巴兹:3,,
嘘:“测试”
});
var filledaray=fill([1,2,3,4,false,'test']);
document.getElementById('obj').textContent=JSON.stringify(filledObject);
document.getElementById('arr').textContent=JSON.stringify(filledArray);
var=[1,2,3];
雷[19]=4;
document.getElementById('spa').textContent=JSON.stringify(fill(searray))代码>
如果您将索引作为值,还有另一种方法
function convertObjectToValue (myObject, val) {
myObject.length = Object.keys(myObject).length;
return Array.prototype.slice.apply(myObject).map(function () {
return val;
}).reduce(function(obj, index, value) {
obj[index] = value;
},{});
}
如果您将索引作为值,那么还有另一种方法
function convertObjectToValue (myObject, val) {
myObject.length = Object.keys(myObject).length;
return Array.prototype.slice.apply(myObject).map(function () {
return val;
}).reduce(function(obj, index, value) {
obj[index] = value;
},{});
}
您是否在询问如何在不使用for
循环的情况下实现这样一个函数?或者这种方法是否存在于本机?事实并非如此。在很多情况下,.reduce
是你的朋友代码>可能是最简单、最快、最简洁的方法,没有神奇的功能!我想我是在问做这件事的最佳功能方式是什么。@TravisJ我会使用for
循环:你会问如何在不使用for
循环的情况下实现这样的功能吗?或者这种方法是否存在于本机?事实并非如此。在很多情况下,.reduce
是你的朋友代码>可能是最简单、最快、最简洁的方法,没有神奇的功能!我想我是在问做这件事最好的功能方式是什么。@TravisJ我会在键上使用for
循环:Preduce
是我没有想到的-那很酷。我认为reduce
是做这件事最合理的功能方式。它很简单,速度应该可以接受。Object.keys
的行为在这里非常方便,因为它也适用于数组。我宁愿使用Object.create(Object.getPrototypeOf(this))
而不是new this.constructor
(如果我们使用FP,它不会有任何副作用,是吗?@Bergi将new
替换为Object.create(Object.getPrototypeOf(obj))
在我的浏览器中似乎不起作用:它总是返回一个对象。对象有什么问题吗?你是说数组的情况吗?reduce
在键上是我没有想到的-这很酷。我认为reduce
是最合理的功能方式。它很简单,速度应该可以接受Object.keys
在这里非常方便,因为它也适用于数组。我宁愿使用Object.create(Object.getPrototypeOf(this))
而不是new this.constructor
(如果我们使用FP,它不会有任何副作用,是吗?@Bergi将new
替换为Object.create(Object.getPrototypeOf(obj))
在我的浏览器中似乎不起作用:它总是返回一个对象。对象有什么问题吗?你是说数组的情况吗?[].slice
在对象上不起作用,map(function(it){return it;})
是一个无操作(可以优化),这会将所有内容转换成一个对象(即使它是以数组开始的,FelixKling在我的回答中也指出了一个缺陷)。@Sube我指出,除非你的索引是数字,否则这不会起作用,但你的答案是肯定的,如果你有0->n个索引数字,这只是一个不同的真理,它会起作用。[].slice
不会对对象起作用,映射(函数(it){返回它;})
是不可操作的(并且可以优化),这将把所有东西都转换成一个对象(即使它是以数组开始的,这也是FelixKling在我的答案中指出的一个缺陷)。@ssube我指出,除非你的索引是数字,否则这不会起作用,但是的,你的答案这只是一个不同的真理,如果你有0->n个索引数字,它就会起作用。