使用Javascript map()函数返回JSON对象的子集

时间:2019-04-10 12:56:45

标签: javascript arrays json

我的问题是,是否有一种简单的方法来返回将包含所有“列”的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 );

3 个答案:

答案 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)