我的问题是,是否有一种简单的方法可以返回包含所有“列”的 JSON 对象子集,而不是单独指定要返回的“列”。
特别是,我有一个转换为 JSON 的多列 csv 文件。下面的函数返回该对象的一个子集 - 如果满足特定条件(在本例中匹配“名称”),则只有两个“列”(作为另一个对象):
var firstSubArr = json.map(function(s) {
if (s.Name === RegName) {
return {
'Price': s.Price,
'Name': s.Name
}
}
}).filter(function(n) {
return n !== undefined
});
是否有更简单的方法从 json 对象返回“所有列”作为对象而不是这个:
return {'Price':s.Price,'Name':s.Name}?
评论: 只是csv转换后的一个简单的JSON结构,eg:
`[ {Name:'Sydney', Price:123, Type:'xyz', etc. 20 more... }, etc. ]`
评论 2:是的,过滤器可能是一个选项,正如一些人所建议的,但如果我的情况有点复杂,比如:
var fullPeriodArr= json.map( function (s) { if(moment(s.Date,"YYYYMMDD").isSameOrBefore(currd) && moment(s.Date,"YYYYMMDD").isSameOrAfter(fullPeriodStart) && (s.Type==sid || s.Type==sid2)&& s.Name===RegName){return [s.Price, s.Name] } }).filter( function (n) { return n!== undefined });
解决方案:
所有 3 位受访者都提供了线索,谢谢!它只是“返回对象数组中符合条件的每个对象”,或者简单地说:
var firstSubArr= json.filter( s => (moment(s.Date,"YYYYMMDD").isSameOrBefore(currd) && moment(s.Date,"YYYYMMDD").isSameOrAfter(fullPeriodStart) && (s.Type==sid || s.Type==sid2) && s.Name===RegName) );
.其中时间范围“从...到”是使用 moment.js 库评估的,日期、类型和名称是对象键。
secret 布丁是复杂条件周围的圆括号 ( )。
Javascript 变得多么简洁:无需获取 .length 也无需使用“for”或“while”循环,无需“if...else”语句,无需存储中间结果,也无需“return” .箭头取代了这一切!
然后你可以访问例如。价格“列”作为汇总计算的数字数组(例如,值的总和):
var firstSubArrPrice=firstSubArr.map(t => t.Price );
最佳答案
摆脱 map()
并只使用 filter()
,您将在结果中得到原始对象
var firstSubArr = json.filter(function(s) {
return s.Name === RegName
});
关于javascript - 使用 Javascript map() 函数返回 JSON 对象的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55613155/