jQuery如何在数组

时间:2016-07-09 15:23:58

标签: javascript jquery arrays

我有以下内容:

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+个桶。问题是,现在建议只是返回response.buckets[0].documents

中的第一个桶w [0]

如何获得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

2 个答案:

答案 0 :(得分:2)

如果您在for - 数组上运行buckets循环,并在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循环根本不会循环,并且advice数组的长度为0。

答案 1 :(得分: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
                    }
                }
            });
        })
    }
}