Functional JS设置对象的所有属性

时间:2015-04-30 15:53:52

标签: javascript functional-programming

我有一个对象private void selectItem(int position) { Toast.makeText(MainActivity.this, "Time for an upgrade", Toast.LENGTH_SHORT).show(); // This is where the fragment view changes will be put Fragment fragment = null; switch (position) { case 0: fragment = new Blank1Fragment(); break; case 1: //fragment = new Blank2Fragment(); fragment = new MapsFragment(); break; case 2: fragment = new Blank3Fragment(); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); mDrawerLayout.closeDrawer(mDrawerList); } else { } } ,如:

myObj

要将每个值设置为{ 0: true, 1: false, 2: false } ,我可以使用循环:

true

但是有没有一种功能方法在javascript中执行此操作?类似的东西:

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

2 个答案:

答案 0 :(得分:4)

您想要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,如:< / p>

&#13;
&#13;
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));
&#13;
<pre id="obj"></pre>
<pre id="arr"></pre>
<pre id="spa"></pre>
&#13;
&#13;
&#13;

请注意,可以正常使用稀疏数组,因为其他键已定义但不具备有意义的数据。

答案 1 :(得分:0)

如果您将索引作为值

,还有另一种方法可以做到这一点
   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;
     },{});
   }