如何访问函数返回的数组中的数据?

时间:2019-04-05 06:56:12

标签: javascript

我有一个函数,该函数返回一个包含数组的值,并且在数组内部是一个对象 data 我想访问其值。

现在,我在做什么

let budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget')
    budgets = budgets[0].data

但是,我不确定这是否是一种巧妙的方法,或者人们通常会做什么。

对JavaScript来说是新手,我认为类似这样的代码

let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data

但不是(为什么?)。我可以做的另一件事是直接在getReference函数中返回相关数据,但是由于该函数是可重用的,因此我并不总是希望数据位于数组的第0位。

总的来说,有经验的程序员也会把上面的代码分为两部分

let budgets = await this.getReference(DocStore, AdData, 'budget')
    budgets = budgets[0].data

如果他们不能更改this.getReference功能?还有,为什么这不起作用?

let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data

5 个答案:

答案 0 :(得分:3)

忘记您想学习的“绝妙技巧”的内容。

  1. 不要仅在下一行声明变量以将其重新分配给其他完全不同的类型。这是代码的味道,在像TypeScript这样的语言中,这是一个很大的禁忌,因为它破坏了类型安全性,也使引擎更难以优化。
  2. 如果您在阅读语句时遇到困难,那是因为需要将其分解为更简单的语句,而不是压缩为更小,更难以阅读的语句。

请牢记以下几点:

const reference = await this.getReference(DocStore, AdData, 'budget')
const budgets = reference[0].data

这没有歧义,它清楚地一步一步传达了正在做的事情。您await引用,然后从引用数组中的第一个条目获取数据。另外,使用const声明是很好的,因为您可以立即得出结论,在阅读代码时永远不会重新分配值。

这对于优化也有好处,因为使用常量引用可以减少在底层引擎中取消对其值进行拆箱的调用次数,因为在其生命周期内它将保持相同的类型和相同的引用。

答案 1 :(得分:2)

想想模棱两可。您是await正在this.getReferenced(...)还是this....data?要直接取消引用结果,您需要使用括号将其清除:

let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;

这是否真的比将其分成两行更具可读性,您自己决定。

答案 2 :(得分:1)

const budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget').then(results => results[0].data)

答案 3 :(得分:0)

你可以做

let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;

但是,如果您只需要属性data,则这是另一种选择:

let {data} = (await this.getReference(DocStore, AdData, 'budget'))[0]

data括在括号中意味着您只想获取名为data的属性。

但是,按照我个人的观点,这是最好的选择:

let budgets = await this.getReference(DocStore, AdData, 'budget');
let {data} = budgets[0];

答案 4 :(得分:0)

如果您查看以下内容:

MDN await

您将看到await关键字将等待承诺完成或拒绝。或者,如果您未通过承诺,则立即返回该值。

因此,您有两个选择:传递一个promise或一个值作为表达式,因为await期望一个表达式。

在这里:

let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data

由于它需要一个表达式,因此将首先对该表达式求值,因此返回值是不确定的,因为您正在访问索引为0的函数。

根据规则,如果您将值传递给await关键字,它将立即返回该值。