【问题标题】:Create array of unique months from JSON object in javascript (without for loop)从 javascript 中的 JSON 对象创建唯一月份数组(没有 for 循环)
【发布时间】:2018-08-12 14:27:12
【问题描述】:

我正在学习 d3 的 javascript 并且正在研究一些基本的数据操作的东西。我有一个简单的年/月/出生数据 JSON 对象,如下所示:

var birthData = [
  { 
    "year": 1967, 
    "month": "January", 
    "births": 31502 
  },
  { 
    "year": 1967, 
    "month": "January", 
    "births": 26703 
  },
  { 
    "year": 1967, 
    "month": "February", 
    "births": 28853 
  },
  { 
    "year": 1967, 
    "month": "February", 
    "births": 26958 
  },
  { 
    "year": 1967, 
    "month": "February", 
    "births": 28591 
  },
  { 
    "year": 1967, 
    "month": "March", 
    "births": 29545 
  },
  { 
    "year": 1967, 
    "month": "March", 
    "births": 30086 
  }]

我想简单地创建一个出现在这个 JSON 对象中的唯一月份数组,如下所示:

["January", "February", "March"]

我宁愿避免使用这种方法

var months = [];
for(var i = 0; i <= birthData.length; i++) {
  var month = birthData[i].month
  if(months.indexOf(month) === -1) {
    months.push(month)
  }
}

有没有更有效的方法来做到这一点?

编辑:作为一个快速跟进的问题,是否有任何非常好的资源用于学习使用 javascript 进行数据操作(特别是使用 d3 或其他图形库)。在 javascript 中快速使用数据操作会让我的生活更轻松!

【问题讨论】:

标签: javascript data-manipulation


【解决方案1】:

您可以将月份映射回一个新数组,然后使用只保存唯一值的 Set 来使数组独一无二,而无需自己进行迭代

var months = [...new Set(birthData.map(i => i.month))]

var birthData = [{
    "year": 1967,
    "month": "January",
    "births": 31502
  },
  {
    "year": 1967,
    "month": "January",
    "births": 26703
  },
  {
    "year": 1967,
    "month": "February",
    "births": 28853
  },
  {
    "year": 1967,
    "month": "February",
    "births": 26958
  },
  {
    "year": 1967,
    "month": "February",
    "births": 28591
  },
  {
    "year": 1967,
    "month": "March",
    "births": 29545
  },
  {
    "year": 1967,
    "month": "March",
    "births": 30086
  }
]

var months = [...new Set(birthData.map(i => i.month))]

console.log(months)

【讨论】:

  • 接受了这个答案,因为我喜欢巧妙地使用集合,因为它只包含唯一值,而且它是 1-liner
【解决方案2】:

使用reduce 是一种简洁的方法:

var months = birthData.reduce((accumulator, item) => 
  accumulator.includes(item.month) 
    ? accumulator 
    : [ ...accumulator, item.month ], []);

它的作用是在构建一个新数组 (accumulator) 时循环遍历所有项目,并在检查是否已将一个月添加到此新数组的条件下确定是否应添加是否将当前项添加到数组中。

以上代码使用 ES2015 语法,下面是等效的 ES5 语法:

var months = birthData.reduce(function(accumulator, item) { 
  return accumulator.indexOf(item.month) > -1
    ? accumulator 
    : accumulator.concat(item.month);
}, []);

【讨论】:

    【解决方案3】:
    const months = birthData.map(month=>month.month);
    const result = months.filter((item,pos)=>months.indexOf(item) === pos);
    

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多