我的问题是,是否有一种简单的方法来返回将包含所有“列”的JSON对象的子集,而不是单独指定要返回的“列”。
特别是,我将多列csv文件转换为JSON。下面的函数返回该对象的子集-如果满足某些条件(在这种情况下,“名称”匹配),则仅两个“列”(作为另一个对象):
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结构,例如:
`[ {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 lib评估的,日期,类型和名称是对象键。
秘密布丁是围绕复杂情况的圆括号()。
Javascript变得多么整洁:无需获取.length或使用“ for”或“ while”循环,无需“ if ... else”语句,也无需存储临时结果,也无需“返回” 。箭头取代了所有这些东西!
然后您可以访问例如。将“列”的价格作为数字数组进行汇总计算(例如,值的总和):
var firstSubArrPrice=firstSubArr.map(t => t.Price );
答案 0 :(得分:4)
摆脱map()
,仅使用filter()
,结果中将包含原始对象
var firstSubArr = json.filter(function(s) {
return s.Name === RegName
});
答案 1 :(得分:2)
我知道您想返回具有符合条件的特定属性的对象。您可以使用reduce()
var firstSubArr = json.reduce((ac,{Name,Price}) => a.Name === RegName ? [...ac,{Name,Price}] : ac, []);
如果您不只希望Name,Price
,也不希望所有带有呼叫名称的属性。然后单独使用filter()
var firstSubArr = json.filter(x => x.Name === RegName)
答案 2 :(得分:1)
怎么样:
var firstSubArr = json.filter( x => x.Name ===RegName)