将对象属性转换为数组值

时间:2018-02-09 15:56:29

标签: javascript typescript

有没有办法解析对象并将其属性分配给数组而不是变量?例如:

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

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

这样可行,但它需要将变量重新设置为数组值。

我试过了:

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

但这是语法错误。

与<{p>}中的Object.values有类似的想法

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

...但是这也存在无法在表达式中进行解构的问题。

4 个答案:

答案 0 :(得分: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,但我不知道你是否真的在乎。祝你好运!

答案 1 :(得分:0)

你无法通过解构实现这一目标。你必须有一行额外的代码。

您可以使用Object.values,但不能失去类型保真度(即最终得到Array<any>

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);

答案 2 :(得分:0)

  

有没有办法解析对象并将其属性分配给数组而不是变量?

你可以做到

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 :(得分:-1)

你可以像这样解构对象

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]

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