打字稿/ Javascript分配并返回单行

时间:2017-03-24 14:23:46

标签: javascript typescript

我多次问自己同样的问题......用JS编写相当直接的代码的所有语法(并不总是直观),我想知道,有人会知道这种操作的单行程吗? / p>

var setFeatured = entry => { 
  entry.isFeatured = true;
  return entry
}

SomeCallThatReturnsAPromise.then(entries => entries.map(setFeatured))

要分配属性并一次性返回对象,我可以直接将其作为entries.map

的arg放入

为了给出对我提出的建议的反馈,常见的答案是在分配或函数调用(返回undefinednull,{{后}后,使用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)) 包含同步调用,或者我的示例可能更准确。

4 个答案:

答案 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)