有没有办法解析对象并将其属性分配给数组而不是变量?例如:
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));`
...但是这也存在无法在表达式中进行解构的问题。
答案 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]
现在对象将被排序,因此您可以预测其行为。