无法使用lodash更改对象键值

时间:2017-07-13 19:14:46

标签: javascript angularjs object ecmascript-6 lodash

var flagsObj = {
  logical1Flag: false,
  operator1Flag: false,
  resourceLeftFlag: false,
  resource1Flag: false,
  resourceRightFlag: false,
};

在上面的对象中,我想改变其中任何一个的值并使其成为真,其余的我想让它变为假。我已经使用了下面提到的这个函数,但是我可以使用map值或foreach函数更改值,但原始的flagsobj没有得到更改。

function settingFlag(val, keyF) { 
   const trueVal = val;
   const falseVal = false;
   const assignedKey = keyF;

_.mapValues(this.flagsObj, (value, key) => {
  if (key === assignedKey) {
    value = true;
  } else {
    value = false;
  }
  // console.log(value);
  console.log(`
    Flags
    ====
    key ${key} value ${value}
  `);
});

或使用forEach来操纵数据

_.forEach(this.flagsObj, (value, key) => {
  if (key === assignedKey) {
    value = true;
    console.log(`
    flags
    =====
    key ${key} value ${value}
    `);
  } else {
    value = false;
  }
});
console.log('::::: FLAGS :::: ', flagsObj);
}

foreach或map值都在改变所需的值,但原始的flagsObj没有改变。

任何能解决问题的lodash功能都值得赞赏。我正在使用angular 1.5 es6应用程序

6 个答案:

答案 0 :(得分:3)

不确定lodash,但普通js中的一个班轮将会这样做

var flagsObj = {
  logical1Flag: false,
  operator1Flag: false,
  resourceLeftFlag: false,
  resource1Flag: false,
  resourceRightFlag: false,
};

function change(obj, key) {
  return Object.keys(obj).forEach(v => obj[v] = v === key);
}

change(flagsObj, "logical1Flag");

console.log(flagsObj);

答案 1 :(得分:0)

你需要退货:

function settingFlag(val, keyF) { 
   const trueVal = val;
   const falseVal = false;
   const assignedKey = keyF;

  return _.mapValues(this.flagsObj, (value, key) => {
    if (key === assignedKey) {
      value = true;
    } else {
      value = false;
    }
    return value;
  });
}

根据lodash docs

  

返回新的映射数组。

它不会改变原来的那个。

_.forEach一个,首先,你应该只在一个数组上使用它(你在一个对象上使用它)。它可能在技术上有效,并且为了论证,即使您使用forEach,设置value = true也只设置变量,而不是对象的属性。您需要this.flagsObject[key] = // true or false

答案 2 :(得分:0)

您可以使用简单的for迭代对象的键,并将值设置为与指定的键匹配的键,否则为false:

var flagsObj = {
  logical1Flag: false,
  operator1Flag: false,
  resourceLeftFlag: false,
  resource1Flag: false,
  resourceRightFlag: false,
};

function settingFlag(val, keyF) {
  for (var key in flagsObj) {
    flagsObj[key] = (key === keyF) ? val : false;
  }
}

settingFlag(true, 'operator1Flag');

console.log(flagsObj);

答案 3 :(得分:0)

根据您要做的事情,可能会有一种更简单的方法。如果一次只有一个标志可以为真,那么你只是想设置哪个;

this.flags = ['logical1', 'operator1', 'resourceLeft', 'resource1', 'resourceRight'];
this.currentFlag = -1;

然后,要设置当前标志,执行this.currentFlag = this.flags.findIndex(a => a === keyF),并获取当前设置的标志,请执行this.flags[this.currentFlag]。这比每次迭代对象更有效,并保持简洁。

答案 4 :(得分:0)

易于;使用obj

forEach参数
_.forEach(this.flagsObj, (value, key, obj) => {
  obj[key] = key === assignedKey
});

答案 5 :(得分:0)

解决此问题的一种方法是将原始Pair存储为常量或重置对象,您可以使用它来恢复所有标志的public int compareTo(Pair<K, V> o) { V val1 = o.getValue(); V val2 = this.getValue(); return val1.compareTo(val2); } 。将其分配给flagsObj,请确保使用lodash#clone克隆它,以避免改变false变量。接下来是创建一个接受我们设置为true的标志的函数;我们使用lodash#assign将所有值从flagsObj分配到ORIGINAL_FLAG_OBJECT以将所有标志修改为false,然后使用lodash#set来设置该特定{{1}键为true。

ORIGINAL_FLAG_OBJECT
flagsObj
flag