我有这行代码,我使用我所知道的最惯用的方式来解析从函数返回的对象:
val (a, b) = foo match { case MyObjectType(a, b) => (a, b) }
Run Code Online (Sandbox Code Playgroud)
该对象的原型是:
case class MyObjectType(Type1: SomeType1, Type2: SomeType2)
Run Code Online (Sandbox Code Playgroud)
当然我可以:
val returnType = foo
val (a, b) = (returnType.a, returnType.b)
Run Code Online (Sandbox Code Playgroud)
但后者则是说明同一问题的另一种形式 - 这实际上并不优雅.一个Scala宏可以拯救提供一个简洁的成语吗?也许允许语法如下:
val (a, b) = foo deconstruct { MyObjectType(a, b) => (a, b) } // merely more shorthand, like scala allows e.g. within a map block
val (a, b) = tuplize(foo) // assumes tuplize can iterate the vals of MyObjectType
tupleResult(a, b) = foo // …Run Code Online (Sandbox Code Playgroud) 我最近在kotlinc,命令行环境中尝试了以下代码.
var greet = Pair("Hello", "World")
val (word1, word2) = greet
Run Code Online (Sandbox Code Playgroud)
输出word1和word2在控制台输出以下消息
>>> word1
error: unresolved reference: word1
word1
^
Run Code Online (Sandbox Code Playgroud)
我不确定是否从最新版本的kotlin中删除了解构.目前,在mac上使用编译器1.0.2版本kotlinc.
我试图看看是否有一种较小的方法将数组转换为es6中的对象.(我不必担心跨浏览器)
我目前有:
function (values) // values being an array.
{
let [videos, video_count, page] = values;
let data = { videos, video_count, page };
someFunctions(data);
moreFunctions(data);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否可以删除该功能的第一行,let [videos....]部分.并以某种方式内联进行转换.
我通过mozilla阅读:解构分配,但我在那里看不到它.(但我可能已经理解错了)而且我真的不够聪明,无法理解ECMA:ES6 Spec.
我怀疑这是不可能的,上面已经是最简单的我可以做到的.但如果我能逃脱不创造videos,video_count和pageTMP变量我会更开心.
我试图构造一个长度为2的数组,但我得到一个打字稿错误:
[ts] Tuple type '[string]' with length '1' cannot be assigned
to tuple with length '2'.
Run Code Online (Sandbox Code Playgroud)
let output = {status: false};
if(execute.permission) {
let message: [string] = execute.params;
if(message.length >= 2) {
// Destructuring follows
[output['position'], output['message']] = message;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么告诉打字稿,这个数组的长度可能是2?
下面的代码正确呈现
export default ({
primitive = "a-sky",
height = "2048",
radius= "30",
width= "2048"
}) => {
const properties = { primitive, height, radius, width}
return <Entity {...properties} />
}
Run Code Online (Sandbox Code Playgroud)
但是,我能做些什么来省略复制道具名称原语,高度等的需要吗?
下面的代码不起作用,但显示了我的意思
let properties
export default ({
primitive = "a-sky",
height = "2048",
radius= "30",
width= "2048"
} = properties) => {
return <Entity {...properties} />
Run Code Online (Sandbox Code Playgroud)
}
我正在测试一些currying-in功能,我可以很容易地让它工作:
test = (a) => { return (b) => a+b } // test(5)(6) => 11
Run Code Online (Sandbox Code Playgroud)
使用ES6 destructing参数时,我无法使用相同的功能:
test = ({a}) => { return (b) => a+b } // test(5)(6) => NaN
Run Code Online (Sandbox Code Playgroud)
有没有办法让它发挥作用?为什么第二个测试功能不起作用?
我一直试图弄清楚嵌套的ES6解构是否支持这种功能.a如果它不存在,我想指定为空对象,然后将其属性名称分配给b范围变量b.
var {
a = {},
a: {
b = 2,
},
} = {};
VM40:4 Uncaught TypeError: Cannot destructure property `b` of 'undefined' or 'null'.
at <anonymous>:6:5
Run Code Online (Sandbox Code Playgroud)
在没有假设对象格式的情况下,我似乎无法真正嵌套解构.以下工作,但我正在寻找一个更简洁的方法,您可以轻松地看到原始对象的嵌套布局.
var {
a = {},
} = {};
var {
b = 2,
} = a;
// works as expected
// starts to look crazy when 'forking' branches that may or may not exist
Run Code Online (Sandbox Code Playgroud) 我不是 100% 清楚这段代码是如何工作的:
var a = [1, 2, 3];
[x, y, ...a ] = [0, ...a, 4];
// OUTPUT: [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我正在a使用...运算符解构数组。
我期待在第二行会进行一系列任务。
的x将被分配为0,y将被分配给...a(其传递数组中的元素a作为单独的值)。
但是,我不清楚如何将...aget 分配给 4。实际上,JS 在执行以下操作时会抛出异常:
...a = 4;
// Uncaught SyntaxError: Rest parameter may not have a default initializer
Run Code Online (Sandbox Code Playgroud)
为什么这段代码以 end 输出修改后的数组4,而不是抛出异常?这是如何工作的?
我正在尝试编写一个咖喱函数dissoc,它接受一个prop和一个对象,并从该对象中删除键及其值。
这是有效的代码:
const dissoc = prop => obj => {
const result = {};
for (let p in obj) {
result[p] = obj[p];
}
delete result[prop];
return result;
};
Run Code Online (Sandbox Code Playgroud)
现在,我认为可以通过使用计算属性,解构和rest运算符来简化代码:
const dissoc = prop => ({ [prop], ...obj}) => obj
Run Code Online (Sandbox Code Playgroud)
但是此代码抛出:
Uncaught SyntaxError: Unexpected token ,
Run Code Online (Sandbox Code Playgroud)
所以我尝试了:
const dissoc = prop => ({ prop, ...obj}) => obj
Run Code Online (Sandbox Code Playgroud)
计算,但只返回不带prop的对象。
有没有办法动态地分解和/或简化此代码?
如果我在 JavaScript 中声明新变量,我可以通过如下解构来实现:
const myObj = {
thing1: 'first thing',
thing2: 'second thing'
};
const { thing1, thing2 } = myObj;
Run Code Online (Sandbox Code Playgroud)
我想做一些类似的事情,但是通过重新分配作为函数中的参数传递的变量(通过隐含分配let,因此不是静态的)。我尝试了以下内容:
function myFun(thing1, thing2) {
const myObj = {
thing1: 'first thing',
thing2: 'second thing'
};
{ thing1, thing2 } = myObj;
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个意外的令牌错误=。这是可能的还是我只能用解构声明新变量?
destructuring ×10
javascript ×8
ecmascript-6 ×4
aframe ×1
arrays ×1
currying ×1
data-class ×1
java ×1
kotlin ×1
macros ×1
reactjs ×1
scala ×1
typescript ×1