【问题标题】:Destructure object properties into array values将对象属性解构为数组值
【发布时间】:2018-02-10 00:45:38
【问题描述】:

有什么方法可以解构对象并将其属性分配到数组而不是变量?例如:

const obj = { a: 1, b: 2 };

const { a, b } = obj;
const arr = [a, b];

这可行,但需要将变量重新表示为数组值。

我试过了:

const arr = [(const { a, b } = obj)];

但这是一个语法错误。

我和Object.values 有类似的想法

const arr = Object.values((const { red } = chalk));`

...但这有同样的问题,不能在表达式中进行解构。

【问题讨论】:

  • 有理由不直接使用[obj.a, obj.b] 吗?
  • @TitianCernicova-Dragomir 是的,这可以正常工作,但是如果我有很多要解构的属性,我必须输入很多 obj.
  • 在第二个示例中,您只有一个属性const arr = Object.values((const { red } = chalk)); 为什么没有const arr = Object.values(chalk.red)
  • 但是,你想单独添加对象的每个属性还是像 [{a: 1, b : 2}]
  • FWIW 你可以让你的原始代码一点更简洁:const { a, b } = obj, arr = [ a, b ];。但是,您仍然需要输入两次名称,并且仍然会在本地范围内引入两个新变量。

标签: javascript typescript


【解决方案1】:

您真正想要的答案是回到过去并在the with statement 被(正确地)识别为邪恶之前使用它:

var obj = { a: 1, b: 2 };
var arr;
with (obj) {
   arr = [a, b];
}

任何现代答案都需要比您想要的更多的输入。一个让您更接近的相对类型安全的答案是使用字符串文字。把它放在图书馆里:

function arrayDestruct<T, K extends keyof T>(obj:T, ...keys: K[]): T[K][] {
  return keys.map(k => obj[k]);
}

然后使用它:

const arr = arrayDestruct(obj, 'a', 'b'); // recognized as number[]

您必须输入一些引号,但它有效。 It could even be overloaded to produce tuples,但我不知道你是否真的足够关心。无论如何,祝你好运!

【讨论】:

    【解决方案2】:

    有什么方法可以解构一个对象并将其属性分配给一个数组而不是变量?

    你可以的

    const arr = [];
    const { a: arr[0], b: arr[1] } = obj;
    

    但我认为你真正在寻找的是等同于 One-liner to take some properties from object in ES 6 的数组文字将是

    const arr = (({a, b}) => [a, b])(obj);
    

    【讨论】:

      【解决方案3】:

      你无法通过解构一击实现这一目标。你必须多写一行代码。

      您可以使用Object.values,但不能不丢失类型保真度(即您最终会使用Array&lt;any&gt;

      interface ObjectConstructor {
          values(obj: {}): any[];
      }
      
      const obj = { a: 1, b: 2 };
      
      // Array<any>
      const arr = Object.values(obj);
      
      // [1, 2]
      console.log(arr);
      

      所以你有一个权衡。用一行代码换取正确的类型信息似乎是经济上的胜利。

      const obj = { a: 1, b: 2 };
      const { a, b } = obj;
      
      // Array<number>
      const arr = [a, b];
      
      // [1, 2]
      console.log(arr);
      

      【讨论】:

        【解决方案4】:

        你可以像这样解构对象

        const [a, b] = Object.values(obj);
        
        console.log(a); // 1
        console.log(b); // 2
        

        请记住,对象的键不是按字母顺序排列的,因此最好创建一个返回排序键的函数,以便您知道值设置正确。

        function deconstructObject(obj){
            const arr = [];  
            const keys = Object.keys(obj);
            const sortedKeys = keys.sort();
                for(const key of sortedKeys){
                    arr.push(obj[key]);
                }
                return arr;
        }
        
        const [a, b] = deconstructObject({b: 2, a: 1 });
        
        console.log(a); // 1
        console.log(b); // 2
        
        const newArray = deconstructObject({b: 2, a: 1 });
        console.log(newArray); //[1,2]
        

        现在对象将被排序,因此您可以预测它的行为。

        【讨论】:

        • 他想将破坏赋值作为一个单独的进程使用。你没有使用它。您正在使用循环并增加其复杂性...O(n^2)
        猜你喜欢
        • 2016-11-09
        • 2019-12-30
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多