【问题标题】:Create an object with same key and value, without duplicating the data创建具有相同键和值的对象,而不复制数据
【发布时间】:2017-08-22 14:02:41
【问题描述】:

在 ES6 中,我们可以这样做:

const key = "foo"
const myObj = { key }
myObj
// => { foo: "foo" }

所以,{ key } 等同于 { key: key }

但是,我们如何在没有key 变量的情况下创建相同的对象?

我想要{ foo: "foo" } 之类的东西。我试过obj = { "foo" },但它抛出了。

在不使用变量且不重复foo 字的情况下,构建此对象的正确方法是什么?

【问题讨论】:

  • 这是不可能的。
  • 你的意思是const foo = "foo"; const myObj = { foo }?或者你想让它假设?
  • @DarrenSweeney 不使用变量
  • 键和值是否会保持同步?如果是这样,您确定不应该改用 Set 吗?
  • @IonicăBizău 我在澄清 - 因此我说或you want it to assume - 你实际上说没有key 变量

标签: javascript object ecmascript-6


【解决方案1】:

但是,我们如何在没有 key 变量的情况下创建相同的对象呢?

我想要{ foo: "foo" } 之类的东西。我试过obj = { "foo" },但是会抛出。

你不能。如果您还没有具有所需名称和值的变量,则必须同时指定名称和值(就像您对问题中的初始示例所做的那样)。

如果您的起点是字符串文字 "foo",则必须将其分配给一个变量并使用该变量 (var x = "foo"; var obj = {}; obj[x] = x;),或者将 foo 写入两次 (var obj = {foo: "foo"})。

但你说你不想做这两件事,所以答案是:你不能。

【讨论】:

    【解决方案2】:

    如果你有一个键名数组,你可以使用 Array.reduce():

    const keyArray = ['foo', 'bar', 'other'];
    const requiredObject = keyArray.reduce((obj, val) => {
      obj[val] = val;
      return obj;
    }, {});
    

    【讨论】:

    • requiredObject 返回'foo'
    • 您应该将{} 作为第二个参数添加到.reduce()
    • 你为什么不像 return {...obj, [obj[val]]: val} atleast 那样使用它
    • @DenKerny 我什至可以做到。只是看起来很难读给我听。解决了函数内部的不变性问题。
    【解决方案3】:

    你可以做的是,使用数组表示法分配,如果键已经存在,它将覆盖值。

    const myObj = {};
    
    // if just you've just a string, you can use the shortcut, instead use the string on twice.
    myObj['key'] = 'key'
    myObj['foo'] = 'foo'
    
    const some_var = 'some_var_value'
    
    myObj[some_var] = some_var
    

    【讨论】:

      【解决方案4】:

      我猜是这样,通过使用 javascript 对象的数组访问属性。

      您可以使用数组括号Obj['propertyname'] === Obj.propertyname中的属性名称字符串访问的任何属性

      const key = "foo"
      const other = "bar";
      const myObj = { };
      myObj[key]  = key;
      myObj[other]  = other;
      console.log(myObj);

      或者,将对象声明为整个对象,因为正如您所说,没有变量。因此,您只需在代码中定义对象即可。

      const myObj = { 
                 foo : 'foo' , 
                 bar: 'bar' 
                 };
      console.log(myObj);

      这已经越过了深渊。

      const myObj = {
         add : function(key) {
            this[key] = key;
         }
      }
      myObj.add('foo');
      myObj.add('bar');
      console.log(myObj);

      没有办法避免不复制变量名或将其分配给变量。

      【讨论】:

      • "...不使用变量..."
      • @T.J.Crowder 如果他没有变量,他到底有什么。 Op 没有具体说明他获取他希望使用的字符串的方法。修改了我的答案以显示直接代码实例化。
      • “如果他没有变量,他到底有什么” 显然,从问题中,字符串文字:"foo"
      【解决方案5】:

      也许你可以使用创作者。

      const keyObjCreator = (key) => {
          const obj = {};
          obj[key] = key;
          return obj;
      };
      
      keyObjCreater3("foo")
      // {foo: "foo"}
      

      【讨论】:

        【解决方案6】:

        您可以使用标记的模板文字来解析并制作您想要做的事情......

        enumify = ([str]) =>
          str
            .replace(/\s/g, '')
            .match(/\{([^\}]+)\}/)[1]
            .replace(/,$/, '')
            .split(',')
            .reduce(
              (o, k) => ({ ...o, [k]: k }),
              {}
            );
          
        const enumObj = enumify`{
          foo,
          bar,
        }`;
        
        const enumObj2 = enumify`{foo,bar}`;
        console.log(enumObj);
        console.log(enumObj2);

        【讨论】:

          【解决方案7】:

          您可以使用一个小工具(最初在 react.js 社区中流行)keyMirror

          var keyMirror = require('keyMirror');
          
          var myObj = keyMirror({ foo: null })
          

          【讨论】:

            【解决方案8】:

            您可以使用Proxy 来默认返回值,即具有所需键值对的对象,以便稍后解构。

            const returnPropNameAsKVPair = {
              get: (target, prop) => ({[prop]: (target[prop] ?? prop)})
            }
            const proxy = new Proxy({ existing:'entry' }, returnPropNameAsKVPair);
            const myObj = {...proxy.existing, ...proxy.foo, ...proxy.bar, ...proxy.bing}
            console.log(myObj)

            如果你只想直接使用代理,你可以有这个处理程序:

            const returnPropNameAsValue = {
              get: (target, prop) => target[prop] ?? prop
            }
            const myObj = new Proxy({ existing:'entry' }, returnPropNameAsValue);
            console.log(myObj.existing, myObj.foo, myObj.bar, myObj.anything)

            这应该让你使用代理作为你的'myObj'对象。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-05-12
              • 1970-01-01
              • 2019-09-29
              • 2020-02-22
              • 2014-02-01
              • 2020-08-23
              • 2011-08-19
              • 1970-01-01
              相关资源
              最近更新 更多