我有以下对象结构:
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;
});
我在这里缺少什么?
答案 0 :(得分:4)
$.grep
用于过滤数组。您的结构不是数组。 $.grep
也只是进行过滤,但您正在讨论过滤(省略Summary
)和映射(仅获取区域名称)。
相反,您可以使用
Object.keys
和push
:
var regions = [];
Object.keys(mapData).forEach(function(key) {
var entry = mapData[key];
if (entry && entry.RegionName) {
regions.push(entry.RegionName);
}
});
Object.keys
,filter
和map
:
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;
});