簡體   English   中英

如何訪問函數返回的數組中的數據?

[英]How do I access data in an array that was returned by a function?

我有一個函數,它返回一個包含數組的值,並且在數組內部,它們是對象數據 ,我想訪問其值。

現在,我正在做的是

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

忘記您想學習的“絕妙技巧”的內容。

  1. 不要僅在下一行聲明變量以將其重新分配給其他完全不同的類型。 這是代碼的味道,在像TypeScript這樣的語言中,這是一個很大的禁忌,因為它破壞了類型安全性,也使引擎更難以優化。
  2. 如果您在閱讀語句時遇到困難,那是因為需要將其分解為更簡單的語句,而不是壓縮為更小,更難以閱讀的語句。

考慮到這一點,請考慮以下幾點:

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

這沒有歧義,並且清楚地一步一步傳達了正在做的事情。 await引用,然后從引用數組的第一個條目中獲取數據。 另外,具有const聲明是很好的,因為您可以立即得出結論,在閱讀代碼時永遠不會重新分配值。

這對於優化也有好處,因為使用常量引用可以減少在底層引擎中取消對其值進行拆箱的調用次數,因為在其生命周期內它將保持相同的類型和相同的引用。

想想模棱兩可。 您正在await this.getReferenced(...)還是this....data 要直接取消引用結果,您需要使用括號將其清除:

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

是否真的比將其分為兩行更具可讀性,您自己決定。

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

你可以做

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];

如果您看一下:

MDN等待

您將看到await關鍵字將等待完全履行或拒絕的承諾。 或者,如果您未通過承諾,則立即返回該值。

因此,您有兩個選擇:將apromise或value作為表達式,因為await期望一個表達式。

在這里:

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

由於它需要一個表達式,因此將首先對該表達式求值,因此返回值是不確定的,因為您正在訪問索引為0的函數。

根據規則的規定,如果您將值傳遞給await關鍵字,它將立即返回該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM