JavaScript ES6 - 这是扩展语法还是剩余语法?
JavaScript ES6 - Is this spread syntax or rest syntax?
我想尽可能多地了解它是如何工作的——尤其是因为它与三元的用法和包含两个展开的对象参数有关。
rows = rows.map(row => (changed[row.ID] ? { ...row, ...changed[row.ID] } : row));
首先 - 传递到地图中的对象的结构如下:
changed
的形状是这样的{"75864":{"ActType":"DEADLINE"}}
rows
格式如下(例如):
[{
"ID": 75864,
"NextDate": "2018-03-02T00:00:00",
"NextTime": "1030am",
"MatterID": 14116,
"Descr": " Responses to pending discovery",
"StatusID": 19,
"Actor_s_": null,
"Accrued": 0,
"Go": "",
"AspNetUserID": null,
"DomainID": 2,
"UserID": 1,
"StatusType": "Pending",
"ActTypeID": 50,
"ActType": "DEADLINE",
"MatterName": "WYNBAS "
如果 row.ID
值与 changed
对象中具有 "truthy" 值的键匹配,
然后你 return 一个新对象,具有 row
的所有值(你展开 row
),然后将匹配 row
的值添加到这个新对象=11=] 对象(你传播了 changed
的真值)。
否则你只需 return 给定的行。
这是您要找的答案吗?
这是"merging" row
和changed[row.ID]
成一个对象。让我们看看当 row
是 ID 为“75864”的那个时会发生什么:
// row: {"ID": 75864, "ActType": "DEADLINE", (more properties)}
// changed: {"75864": {"ActType": "OTHER ACTION"}}
// (Note - I changed `changed` so that the ActType specified is different from
// what's already in the row object, otherwise it's really difficult for me to
// demonstrate exactly what's happening here.)
// This is the body of the arrow function:
return changed[row.ID] ? { ...row, ...changed[row.ID] } : row
// Well, changed[row.ID] does exist:
// changed[row.ID]: {"ActType": "OTHER ACTION"}
// So we take this branch of the ternary:
return { ...row, ...changed[row.ID] }
// Basically, this expression works like an array spread, but for objects.
// As a refresher, here's what an array spread might look like:
//
// a = [1, 2, 3]
// b = ['cat', 'dog', 'armadillo']
// c = [...a, ...b]
// c: [1, 2, 3, 'cat', 'dog', 'armadillo']
//
// The array spread works by creating a completely new, empty array. Then
// it adds the items of each array that's spread into it; so first it adds
// all the items of a (1, 2, 3), then all the items of b (cat, dog, armadillo).
// Object spread works pretty much the same way. First we create a completely
// new object: {}.
// Then we add all the properties of row: {ID: 75864, ActType: "DEADLINE",
// "MatterID": 14116, (more properties)}.
// Then it adds the the properties of changed[row.ID]. This is the important
// part, because changed[row.ID] actually *overwrites* any properties that
// we've already added from "row". This makes the result look like this:
return {ID: 75864, ActType: "OTHER ACTION", MatterID: 14116, (more properties)}
// Note that the return value's ActType property is OTHER ACTION, not DEADLINE!
请注意,对象展开本质上与使用 Object.assign
并将空对象作为第一个参数相同。 (Object.assign 从第二个、第三个等参数中获取所有属性,并将它们设置在第一个参数上。这意味着它实际上改变了 - 变异 - 它的第一个参数;在这里,我们没有变异 row
,我们将返回一个全新的对象 ,基于 row
(和 changed[row.ID]
)。)所以用 Object.assign 编写代码看起来像这个:
return Object.assign({}, row, changed[row.ID])
我想尽可能多地了解它是如何工作的——尤其是因为它与三元的用法和包含两个展开的对象参数有关。
rows = rows.map(row => (changed[row.ID] ? { ...row, ...changed[row.ID] } : row));
首先 - 传递到地图中的对象的结构如下:
changed
的形状是这样的{"75864":{"ActType":"DEADLINE"}}
rows
格式如下(例如):
[{
"ID": 75864,
"NextDate": "2018-03-02T00:00:00",
"NextTime": "1030am",
"MatterID": 14116,
"Descr": " Responses to pending discovery",
"StatusID": 19,
"Actor_s_": null,
"Accrued": 0,
"Go": "",
"AspNetUserID": null,
"DomainID": 2,
"UserID": 1,
"StatusType": "Pending",
"ActTypeID": 50,
"ActType": "DEADLINE",
"MatterName": "WYNBAS "
如果 row.ID
值与 changed
对象中具有 "truthy" 值的键匹配,
然后你 return 一个新对象,具有 row
的所有值(你展开 row
),然后将匹配 row
的值添加到这个新对象=11=] 对象(你传播了 changed
的真值)。
否则你只需 return 给定的行。
这是您要找的答案吗?
这是"merging" row
和changed[row.ID]
成一个对象。让我们看看当 row
是 ID 为“75864”的那个时会发生什么:
// row: {"ID": 75864, "ActType": "DEADLINE", (more properties)}
// changed: {"75864": {"ActType": "OTHER ACTION"}}
// (Note - I changed `changed` so that the ActType specified is different from
// what's already in the row object, otherwise it's really difficult for me to
// demonstrate exactly what's happening here.)
// This is the body of the arrow function:
return changed[row.ID] ? { ...row, ...changed[row.ID] } : row
// Well, changed[row.ID] does exist:
// changed[row.ID]: {"ActType": "OTHER ACTION"}
// So we take this branch of the ternary:
return { ...row, ...changed[row.ID] }
// Basically, this expression works like an array spread, but for objects.
// As a refresher, here's what an array spread might look like:
//
// a = [1, 2, 3]
// b = ['cat', 'dog', 'armadillo']
// c = [...a, ...b]
// c: [1, 2, 3, 'cat', 'dog', 'armadillo']
//
// The array spread works by creating a completely new, empty array. Then
// it adds the items of each array that's spread into it; so first it adds
// all the items of a (1, 2, 3), then all the items of b (cat, dog, armadillo).
// Object spread works pretty much the same way. First we create a completely
// new object: {}.
// Then we add all the properties of row: {ID: 75864, ActType: "DEADLINE",
// "MatterID": 14116, (more properties)}.
// Then it adds the the properties of changed[row.ID]. This is the important
// part, because changed[row.ID] actually *overwrites* any properties that
// we've already added from "row". This makes the result look like this:
return {ID: 75864, ActType: "OTHER ACTION", MatterID: 14116, (more properties)}
// Note that the return value's ActType property is OTHER ACTION, not DEADLINE!
请注意,对象展开本质上与使用 Object.assign
并将空对象作为第一个参数相同。 (Object.assign 从第二个、第三个等参数中获取所有属性,并将它们设置在第一个参数上。这意味着它实际上改变了 - 变异 - 它的第一个参数;在这里,我们没有变异 row
,我们将返回一个全新的对象 ,基于 row
(和 changed[row.ID]
)。)所以用 Object.assign 编写代码看起来像这个:
return Object.assign({}, row, changed[row.ID])