我多次问自己同样的问题......用JS编写相当直接的代码的所有语法(并不总是直观),我想知道,有人会知道这种操作的单行程吗? / p>
var setFeatured = entry => {
entry.isFeatured = true;
return entry
}
SomeCallThatReturnsAPromise.then(entries => entries.map(setFeatured))
要分配属性并一次性返回对象,我可以直接将其作为entries.map
为了给出对我提出的建议的反馈,常见的答案是在分配或函数调用(返回undefined
,null
,{{后}后,使用OR运算符返回结果1}},false
,以及在OR之后触发该部分的任何事物:
never
我的问题是要知道我是否可以利用更紧凑的语法:
return entry.isFeatured = true || entry
会比以下更容易阅读:
SomeCallThatReturnsAPromise()
.then((entries:EntryType[]) => entries
.map(entry => entry.isFeatured = true || entry)
.filter(entry => entry.something == true))
.then((entries:EntryType[]) => someCallThatReturnsNothingButHasToBeDoneThere() || entries)
.then((entries:EntryType[]) => console.log(entries))
注意:
1)我尽量避免为此创建一个函数。我的问题是出于好奇心,只关注Vanilla ES6或7语法提供的内容。
2)我接到回答是使用SomeCallThatReturnsAPromise
.then((entries:EntryType[]) => entries
.map(entry => {
entry.isFeatured = true;
return entry;
})
.filter(entry => entry.something == true))
.then((entries:EntryType[]) => {
someCallThatReturnsNothingButHasToBeDoneThere();
return entries;
})
.then((entries:EntryType[]) => console.log(entries))
而不是.forEach
。我使用函数方法设计我的代码(因此紧凑回调的重要性),所以.map
对我来说不一定是一个好选择(显然它在性能或内存方面没有优于map的优势)消费)。在处理promises回调或数组函数链时,单行语法都很方便......
3)使用OR运算符时返回的类型是联合类型.forEach
。因此它打破了后续调用的类型,并暗示了一个类型断言:
EntryType|null
情况变得越来越重......我仍然不知道我是否会使用它或坚持两行,包括return语句。
4)这是一个简化的例子。我知道我的第一个SomeCallThatReturnsAPromise()
.then((entries:EntryType[]) => entries
.map(entry => (entry.isFeatured = true || entry) as EntryType)
.filter(entry => entry.something == true))
.then((entries:EntryType[]) => (someCallThatReturnsNothingButHasToBeDoneThere() || entries) as EntryType[])
.then((entries:EntryType[]) => console.log(entries))
包含同步调用,或者我的示例可能更准确。
答案 0 :(得分:5)
entries.forEach( (entry) => entry.isFeatured = true );
无需单独定义功能。
此外,由于您的元素是对象并通过引用处理,因此可以用map()
替换forEach()
,这样就无需返回值。
(使用map()
你会得到两个由相同元素组成的数组,这些数组可能不是,你需要的是什么)
答案 1 :(得分:3)
你可以做@Sirko写的那些但是这样回来:
SomeCallThatReturnsAPromise.then(entries => entries.forEach(entry => entry.isFeatured = true) || entries)
没有必要使用map
,而使用forEach
会给你一个“单行”,但是你想要使用逻辑或({{}返回你收到的相同值1}})你可以做到。
答案 2 :(得分:2)
虽然@Sirko是对的,在特定情况下,forEach
比使用map
更有意义我认为OP正在提出一般性问题。
因此,一般来说,如何分配属性然后返回整个对象?这是我的建议:
function mutateObject(element, value) {
return (element.prop = value) && element || element
}
var object = {prop:1}
var returned = mutateObject(object, 2)
console.log(returned)

它是如何工作的?第一部分(element.prop = value)
将value
分配给属性,并将value
返回到表达式。
如果返回的值是falsy,则返回||
子句的值。如果它真实,则会返回&&
的值。
在这种情况下,无论我们在属性中设置什么,我们都会同时返回element
本身,以确保它始终会返回它的对象。
编写它的另一种方法是(element.prop = value) ? element : element
但是,使用这种语法,它看起来更像是一个拼写而不是比较,所以我更喜欢其他语法。
答案 3 :(得分:1)
//Example 1
const gimmeSmile = {}
console.log({ ...gimmeSmile, smile: ":)" })
// Example 2
const smiles = [{},{},{}]
.map(obj => ( { ...obj, smile: ":)"} ));
console.log(smiles)