2015-10-18 71 views
3

我很難過。如何處理Javascript空對象?

這是代碼:

const clientInfoPromise = buildPromiseMethod 
clientInfoPromise.then((clients) => { 
    console.log('clients ' + JSON.stringify(clients)) 
    console.log(clients.typeOf) 
    console.log(_.keys(clients)) 

這是輸出:

clients {} 
undefined 
['undefined'] 

我想_.keys(客戶端),以返回一個空數組,而不是與所述串的陣列「未定義」 。 _.isEmpty(clients) ? [] : _.keys(clients)不起作用,因爲_.isEmpty返回false

ClientInfoPromise在此定義:

static buildPromiseMethod(cids) { 
    if (condition) { 
     // fetch data 
     const data = [data,data1,data2] 
     return Promise.resolve(_.zipObject(cids, data)); 
    } else { 
     const clients = _(cids) 
     .indexBy() 
     .mapValues(() => { 
      return undefined; //contains empty data 
     }) 
     .value(); 
     return Promise.resolve(clients); 
    } 
    } 

cids可以undefined[],或[1,2,3](數字的陣列)。

+0

看起來你錯過了第一個代碼塊末尾的大括號和parens。 – Eric

+0

hmm? '_.keys(undefined).length === 0' – Brian

+0

如果這些答案對您有幫助,請接受其中之一。 – 2015-10-24 13:56:06

回答

3

的console.log(clients.typeOf)

要登錄的clients使用console.log(typeof clients)類型。

的console.log(_。鍵(客戶端))
< [ '不確定']

_.key報道稱,clients有一個單一的鍵,它被命名爲"undefined"。最有可能的是,這個鍵值對沒有被stringify顯示,因爲它的值也是未定義的,這意味着它將被跳過stringify

爲了驗證這一點,而不是

的console.log( '客戶' + JSON.stringify(客戶端))

使用

console.log('clients', clients) 

這將顯示您所有屬性,包括那些stringify會因爲它們的值未定義而跳過的屬性。

在您的具體情況下,您報告的行爲最好通過buildPromiseMethod中的錯誤進行解釋,即它返回的承諾正在使用具有非序列化值的單一鍵「undefined」解析爲對象。例如,考慮以下幾點:。

> clients = { undefined: undefined }; 
> console.log('clients ' + JSON.stringify(clients)) 
< clients {} 

> console.log(_.keys(clients)) 
< ['undefined'] 

這是你得到什麼

然而,這不是明擺着怎麼buildPromiseMethod可以返回這樣一個格式錯誤的對象最有可能的罪魁禍首是zipObject是不是真的確切的源代碼,你正在運行?例如,_.zipObject([cids], data)(指定cids作爲數組,當它的值是不確定的,而data還包含未定義的值)可能導致報告行爲:

var data, data1, data2;  // values are undefined 
data = [data, data1, data2]; 
var cids = undefined; 
_.zipObject([cids], data); 

> { undefined: undefined } 

順便說一句,很可能是你的承諾的用途錯,至少假設// fetch data是異步的。你可能想要

static buildPromiseMethod(cids) { 
    if (condition) { 
    return fetchdata().then(data => 
     _.zipObject(cids, data)); 
    } 

或類似的東西。如果data1等等是從承諾中回來的,並且您在承諾完成之前試圖訪問它,則這可能與您的問題有關,在這種情況下,其值將不確定。