从javascript中的JSON对象创建唯一月份数组(不带for循环)

从javascript中的JSON对象创建唯一月份数组(不带for循环),javascript,data-manipulation,Javascript,Data Manipulation,我正在学习javascript中的d3,并且正在做一些基本的数据操作。我有一个简单的年/月/出生数据JSON对象,如下所示: var birthData = [ { "year": 1967, "month": "January", "births": 31502 }, { "year": 1967, "month": "January", "births": 26703 }, { "year": 19

我正在学习javascript中的d3,并且正在做一些基本的数据操作。我有一个简单的年/月/出生数据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 
  }]
["January", "February", "March"]
我想简单地制作一个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 
  }]
["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)
  }
}
var月数=[];

对于(var i=0;i而言,使用
reduce
是一种简洁的方法:

var months = birthData.reduce((accumulator, item) => 
  accumulator.includes(item.month) 
    ? accumulator 
    : [ ...accumulator, item.month ], []);
它的作用是在构建新数组(
累加器
)时循环所有项目,并在检查是否已将月份添加到此新数组的条件下,确定是否应将当前项目的月份添加到数组中

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

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

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

var months = birthData.reduce((accumulator, item) => 
  accumulator.includes(item.month) 
    ? accumulator 
    : [ ...accumulator, item.month ], []);
它的作用是在构建新数组(
累加器
)时循环所有项目,并在检查是否已将月份添加到此新数组的条件下,确定是否应将当前项目的月份添加到数组中

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

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

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

var months = [...new Set(birthData.map(i => i.month))]
var birthData=[{
“年份”:1967年,
“月”:“一月”,
“出生”:31502
},
{
“年份”:1967年,
“月”:“一月”,
“出生”:26703
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:28853
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:26958
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:28591
},
{
“年份”:1967年,
“月”:“三月”,
“出生”:29545
},
{
“年份”:1967年,
“月”:“三月”,
“出生”:30086
}
]
var months=[…新集合(birthData.map(i=>i.month))]

log(months)
您可以将月份映射回一个新数组,然后使用一个只保存唯一值的集合,使数组唯一,而无需自己迭代

var months = [...new Set(birthData.map(i => i.month))]
var birthData=[{
“年份”:1967年,
“月”:“一月”,
“出生”:31502
},
{
“年份”:1967年,
“月”:“一月”,
“出生”:26703
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:28853
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:26958
},
{
“年份”:1967年,
“月”:“二月”,
“出生”:28591
},
{
“年份”:1967年,
“月”:“三月”,
“出生”:29545
},
{
“年份”:1967年,
“月”:“三月”,
“出生”:30086
}
]
var months=[…新集合(birthData.map(i=>i.month))]

console.log(月)
此问题不需要D3的可能重复。您可以使用内置于JS中的数组方法来完成此问题。此问题不需要D3的可能重复。您可以使用内置于JS中的数组方法来完成此问题。接受此答案是因为我喜欢巧妙地使用集合,因为它只包含唯一的值,并且它是一个1-lineracepted th答案是因为我喜欢巧妙地使用集合,因为它只保存唯一的值,而且是一个1行