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

标签 javascript functional-programming

我有一个对象myObj,例如:

{
  0: true,
  1: false,
  2: false
}

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

for (i in myObj) {
  myObj[i] = true
}

但是有没有一种实用的方法可以在 JavaScript 中做到这一点?像这样的东西:

myOjb.fill(true)

最佳答案

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

你只需这样做:

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;
  }, {});
}

如果您想保持与原始对象相同的原型(prototype),假设您正在使用具有无参数构造函数(对象和数组计数)的简单类型,则可以使用 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>

请注意,这对于稀疏数组无法正常工作,因为定义了其他键但没有有意义的数据。

关于javascript - 函数式 JS 设置对象的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972383/

相关文章:

javascript - "classic"和 "module"Web Worker 有什么区别?

javascript - 在 React Hook 表单中显示来自 Controller 的错误

javascript - 如何隐藏使用 Electron 构建的 nodeJS 解决方案的源代码(asar 文件)?

javascript - 基本的 JavaScript 内嵌函数解释

javascript - 为什么 Array.prototype.reduce 没有 thisObject 参数?

typescript - 如何使用 fp-ts 将 TaskOption 转换为 TaskEither?

.net - F# - 不理解函数组合(将获取文件函数转换为获取重复文件函数)

scala - 如何在 Scala 中跟踪函数评估?

scala - 更优雅的写法 if(list.nonEmpty) Some(list.max) else None?

php - 涉水通过另一个 "programmer' s"PHP/MySQL 代码