函数式 JS 设置对象的所有属性

jcu*_*nod 0 javascript functional-programming

我有一个对象,myObj如:

{
  0: true,
  1: false,
  2: false
}
Run Code Online (Sandbox Code Playgroud)

要将每个值设置为true,我可以使用循环:

for (i in myObj) {
  myObj[i] = true
}
Run Code Online (Sandbox Code Playgroud)

但是在javascript中是否有一种功能性的方法来做到这一点?就像是:

myOjb.fill(true)
Run Code Online (Sandbox Code Playgroud)

ssu*_*ube 5

您想要Object.keys(如果在您的环境中可用)。它枚举当前对象上的键,跳过原型属性等。

你会简单地做:

function fill(obj) {
  Object.keys(obj).forEach(function (key) {
    obj[key] = true;
  });
}
Run Code Online (Sandbox Code Playgroud)

如果你想真正使用它,你可以使用 reduce 并避免副作用:

function fill(obj) {
  return Object.keys(obj).reduce(function (p, key) {
    p[key] = true;
    return p;
  }, {});
}
Run Code Online (Sandbox Code Playgroud)

如果您想保持与原始对象相同的原型,假设您正在使用具有无参数构造函数(对象和数组计数)的简单类型,您可以使用obj.constructor

function fill(obj) {
  Object.keys(obj).forEach(function (key) {
    obj[key] = true;
  });
}
Run Code Online (Sandbox Code Playgroud)
function fill(obj) {
  return Object.keys(obj).reduce(function (p, key) {
    p[key] = true;
    return p;
  }, {});
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不适用于稀疏数组,因为其他键已定义但没有有意义的数据。