2016-07-09 34 views
-2

的動態長度$ .MAP我有以下幾點:的jQuery如何通過一個數組

transformResult: function(response) { 
    if (response && response.buckets && response.buckets[0] && response.buckets[0].documents) { 
    return { 
     suggestions: $.map(response.buckets[0].documents, function(dataItem) { 
      return { value: dataItem._id, data: { 
      key: response.buckets[0].key, 
      url: dataItem.url 
      } 
      }; 
     }) 
    }; 

    } 

我使用response.buckets[0],以確保至少一個水桶在陣列中存在。可以有0個或1個以上的桶。問題是,現在的建議是剛剛回國的第一桶W [0] response.buckets[0].documents

我怎樣才能獲得建議,返回0以上$.map(response.buckets[0].documents

感謝

更新

transformResult: function(response) { 
    var suggestions = { 
    suggestions: {} 
    }; 

    if(!response || !response.buckets) { 
    return suggestions; 
    } 

    for(var i=0;i<response.buckets.length;i++) { 
    var bucket = response.buckets[i]; 
    if(!!bucket.documents) { 

     suggestions.concat($.map(bucket.documents, function(item) { 
      return { 
       value: item._id, 
       data: { 
       key: bucket.key, 
       url: item.url 
       } 
      } 
     })); 



    }; 
    } 

    return suggestions; 

}, 

本所現示數寬:Uncaught TypeError: suggestions.concat is not a function

+3

你爲什麼不檢查'length':'響應.buckets.length' ??? –

+2

@ user2181397不,如果'response.buckets [0]'沒有定義,它會引發一個錯誤 –

+1

第一:'var suggestions'應該是'{suggestions:[]}',第二:Array.concat返回一個包含結果,它不會改變當前的數組。所以你實際上必須編寫'suggestions.suggestions = suggestions.suggestions.concat(...)' – Thomas

回答

1

我不能完全肯定閹我收到了你的意圖和數據結構的權利,但我認爲你正在尋找這樣的:

transformResult: function(response) { 
    //seems that $.map() doesn't handle null-values :( 
    //so I have to take care of this 
    var emptyArray = []; 
    return { 
     suggestions: $.map(response && response.buckets || emptyArray, function(bucket){ 
      //jQuerys map-implementation is actually more like a fmap. 
      //so this doesn't return an Array of Arrays, but one flat Array instead 
      return $.map(bucket.documents || emptyArray, function(document){ 
       return { 
        value: document._id, 
        data: { 
         key: bucket.key, 
         url: document.url 
        } 
       } 
      }); 
     }) 
    } 
} 
+0

哇!這工作。謝謝!所以乾淨優雅。 – AnApprentice

2

如果在buckets陣列上運行for循環,並在for內運行map函數,則每個元素都應該達到您的要求。

var suggestions = []; 
if(!response || !response.buckets) { 
    return { suggestions: suggestions }; 
} 
for(var i=0;i<response.buckets.length;i++) { 
    var bucket = response.buckets[i]; 
    if(!!bucket.documents) { 
     suggestions.concat($.map(bucket.documents, function(item) { 
      return { 
       value: item._id, 
       data: { 
        key: bucket.key, 
        url: item.url 
       } 
      }; 
     })); 
    }  
} 
return { suggestions: suggestions }; 

如果存在0個存儲桶,則for循環將根本不會循環,並且suggestions數組的長度將爲0。

+0

您還需要檢查''response''上是否存在'buckets'屬性,就像OP代碼一樣。它暗示它可以是'null',這意味着調用'null'上的'length'屬性將會拋出錯誤 –

+0

錯過了,會更新答案,thnx;) – Jite

+0

suggestions = []不起作用,它必須是以這種格式:var suggestions = { suggestions:{} }; 上面更新的代碼。 – AnApprentice

相關問題