如何grep这个Javascript对象数组?

时间:2016-10-17 16:01:22

标签: javascript jquery

我有以下对象结构:

var mapData = 
{
   Summary:
   {
      ReportName: 'Month End Report'
   },
   NortheastRegion:
   {
      Property1: 123,
      RegionName: 'Northeast'
   },
   SoutheastRegion:
   {
      Property1: 456,
      RegionName: 'Southeast'   
   },   
}

我想编写一个返回区域名称数组的grep函数。以下函数未返回任何值:

var regions = $.grep(mapData, function(n,i)
{
   return n.RegionName;
});

我在这里缺少什么?

5 个答案:

答案 0 :(得分:4)

$.grep用于过滤数组。您的结构不是数组。 $.grep只是进行过滤,但您正在讨论过滤(省略Summary)和映射(仅获取区域名称)。

相反,您可以使用

  • Object.keyspush

    var regions = [];
    Object.keys(mapData).forEach(function(key) {
        var entry = mapData[key];
        if (entry && entry.RegionName) {
            regions.push(entry.RegionName);
        }
    });
    
  • Object.keysfiltermap

    var regions = Object.keys(mapData)
        .filter(function(key) {
            return !!mapData[key].RegionName;
        })
        .map(function(key) {
            return mapData[key].RegionName;
        });
    
  • for-in循环和push

    var regions = [];
    for (var key in mapData) {
         if (mapData.hasOwnProperty(key)) {
             var entry = mapData[key];
             if (entry && entry.RegionName) {
                 regions.push(entry.RegionName);
             }
         }
    }
    

......可能是其他人。

答案 1 :(得分:1)

这是一个对象,而不是一个数组。根据{{​​3}},如果mapData是数组,则上述示例将起作用。

您可以将jQuery docs用于此类事情:

var regions = _.mapValues(mapData, function(o) {
  return o.RegionName;
});

ES6:

const regions = _.mapValues(mapData, o => o.RegionName)

答案 2 :(得分:1)

jQuery.grep() docs中所述,您应该将数组作为要搜索的数据传递,但mapData是一个对象。但是,您可以使用Object.keys()循环访问对象键,但AFAIK您必须使用特定于您的案例的功能,例如:



var mapData = 
{
   Summary:
   {
      ReportName: 'Month End Report'
   },
   NortheastRegion:
   {
      Property1: 123,
      RegionName: 'Northeast'
   },
   SoutheastRegion:
   {
      Property1: 456,
      RegionName: 'Southeast'   
   },   
};

var keys = Object.keys(mapData),
    result = [];

console.log(keys);

keys.forEach(function(key) {
  var region = mapData[key].RegionName;
  
  if (region && result.indexOf(region) == -1) {
    result.push(region);
  }
});

console.log(result);

// Short version - based on @KooiInc answer
console.log(
  Object.keys(mapData).map(m => mapData[m].RegionName).filter(m => m)
);




答案 3 :(得分:1)

$.grep用于数组。 mapData是一个对象。您可以尝试使用地图/过滤器作为mapData的键,例如:

var mapData = 
{
   Summary:
   {
      ReportName: 'Month End Report'
   },
   NortheastRegion:
   {
      Property1: 123,
      RegionName: 'Northeast'
   },
   SoutheastRegion:
   {
      Property1: 456,
      RegionName: 'Southeast'   
   },   
};

var regionNames = Object.keys(mapData)
 .map( function (key) { return mapData[key].RegionName; } )
 .filter( function (name) { return name; } );
console.dir(regionNames);

// es2105 
var regionNames2 = Object.keys(mapData)
 .map( key => mapData[key].RegionName  )
 .filter( name => name );
console.dir(regionNames2);

答案 4 :(得分:0)

只需将$.grep转为 $。map ,您就可以了。

var regions = $.map(mapData, function(n,i)
{
   return n.RegionName;
});