使用变量

时间:2019-07-17 04:09:06

标签: javascript object ecmascript-6

我想设置多个具有相同值的对象属性。

const SHOW_PAYMENT_DIALOG = 'SHOW_PAYMENT_DIALOG';
const SHOW_BUSINESS_DIALOG = 'SHOW_BUSINESS_DIALOG';

const handler = (state, payload) => {
    return {
        ...state,
        data: payload
    };
  };

const object = {
  [SHOW_BUSINESS_DIALOG]: handler,
  [SHOW_PAYMENT_DIALOG]: handler,
};

如上例所示,我必须为2个属性SHOW_BUSINESS_DIALOGSHOW_PAYMENT_DIALOG手动分配处理程序

是否可以通过js api快速即时设置,但无需引入新功能来处理此类问题

const object = {
      [SHOW_BUSINESS_DIALOG, SHOW_PAYMENT_DIALOG]: handler,
    };

2 个答案:

答案 0 :(得分:2)

如果可以确定对每个值使用相同的对Object.fromEntries()的引用,可以将.map()handler一起使用(代码段控制台输出显示处理程序方法是如何每个值都有相同的引用,这就是为什么它看起来有点奇怪的原因):

const SHOW_PAYMENT_DIALOG = 'SHOW_PAYMENT_DIALOG';
const SHOW_BUSINESS_DIALOG = 'SHOW_BUSINESS_DIALOG';

const handler = (state, payload) => {
  return {
    ...state,
    data: payload
  };
};

const keys = [SHOW_PAYMENT_DIALOG, SHOW_BUSINESS_DIALOG];
const object = Object.fromEntries(keys.map(k => [k, handler]));

console.log(object);

请注意,.fromEntries()当前在draft mode中,但是,我认为在这种情况下,将通用if语句与Set一起使用(使用.has())会更好比使用对象:

const SHOW_PAYMENT_DIALOG = 'SHOW_PAYMENT_DIALOG';
const SHOW_BUSINESS_DIALOG = 'SHOW_BUSINESS_DIALOG';

const handler = (state, payload) => {
  return {
    ...state,
    data: payload
  };
};

const get_handler = key => {
  const keys = new Set([SHOW_PAYMENT_DIALOG, SHOW_BUSINESS_DIALOG]);
  if(keys.has(key))
    return handler;
}

console.log(get_handler(SHOW_BUSINESS_DIALOG)); // hanlder
console.log(get_handler("foo")); // undefined

答案 1 :(得分:1)

您可以创建一个泛型函数并传递键数组,并通过keyArr循环并为每个键放置值

const SHOW_PAYMENT_DIALOG = 'SHOW_PAYMENT_DIALOG';
const SHOW_BUSINESS_DIALOG = 'SHOW_BUSINESS_DIALOG';

let value = "some value"
const object = { someKey: 'value'};

let dynamicSetValues = (keyArr, value) => {
  keyArr.forEach(key => {
    object[key] = value
  })
}

dynamicSetValues(['SHOW_PAYMENT_DIALOG','SHOW_BUSINESS_DIALOG'], value)

console.log(object)

注意:- 这会改变原始对象,如果您希望保持不变性,则可以复制对象并将值放在所需的键上,并每次从功能