【问题标题】:Return subset of JSON Object using Javascript map() function使用 Javascript map() 函数返回 JSON 对象的子集
【发布时间】:2021-08-13 03:28:32
【问题描述】:

我的问题是,是否有一种简单的方法可以返回包含所有“列”的 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结构,例如:

`[ {名称:'Sydney',价格:123,类型:'xyz',等等 20 更多...}, 等等 ]`

评论 2:是的过滤器可能是几个人建议的一个选项,但如果我的情况有点复杂,比如:

var fullPeriodArr= json.map( 函数 (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(函数(n){ 返回 n!== 未定义 });

解决方案:

所有 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”语句,或无需存储中间结果,也无需“return” .箭头取代了这一切!

然后您可以访问例如。价格“列”作为汇总计算的数字数组(例如值的总和):

var firstSubArrPrice=firstSubArr.map(t => t.Price );

【问题讨论】:

  • 您能否详细说明一下并添加告诉json 的样子。
  • 你希望它只是纯js吗?

标签: javascript arrays json


【解决方案1】:

去掉map(),只使用filter(),你就会得到原来的对象

var firstSubArr = json.filter(function(s) {
  return s.Name === RegName
});

【讨论】:

  • JSON 对象不会有过滤选项,因为它们不是数组
  • @user37309 不,OP 没有说它的对象。它是一个对象数组。正如 OP 使用的`map()` 已经
  • @user37309 - OP 正在执行 map,所以它是一个数组。
  • 注意:filter() 返回一个新数组,其中包含返回值为true 的元素。
  • 公平 - 我认为他试图通过一组键过滤对象
【解决方案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)

【讨论】:

    【解决方案3】:

    怎么样:

    var firstSubArr = json.filter( x => x.Name ===RegName)  
    

    【讨论】:

    • 这个答案与问题基本相同!
    • 好吧,因为它们已经是您只需要过滤的对象。不要回答 OP 的问题。
    【解决方案4】:

    要使用 JavaScript,我推荐以下代码:

    var valueNeedly = json.filter(function(s) {
      return s.value === searchValue
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2015-03-22
      • 2018-01-02
      • 2017-03-30
      相关资源
      最近更新 更多