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
循环:P
reduce
是我没有想到的-那很酷。我认为
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个索引数字,它就会起作用。