将现有的数组转换为一个新数组。

5

我有一个数组,需要将其转换为适合我的工作的新数组。这是我的原始数组:

注意:在我的代码中,'jayanagar'、'mallashwaram'、'kolar' 被称为城市。

var array1=[
  ["Year", "2018-8", "2017-8"],
  ["JAYANAGAR", "2018-8", 10910665], 
  ["MALLESHWARAM", "2018-8", 2018451],
  ["KOLAR", "2018-8", 2277562], 
  ["JAYANAGAR", "2017-8", 1134]
]

我将其转换为如下内容:

var array2=[
  ["Year", "Jul 2018", "Jul 2017"], 
  ["JAYANAGAR", 10910665, 1134], 
  ["MALLESHWARAM", 2018451], 
  ["KOLAR", 2277562]
]

我的目标是:

  • 如您在arra1中所见,我有两年的数据,即 2018-82017-8,对于日期 2018-8,我有所有城市的数据,但是对于日期 2017-08,我只有一个城市的数据,即 jayanagar

  • 因此,我想要做的是,每当先前日期的城市数量较少时,我都想要将其显示为该城市的0

  • 例如,在array2中,我没有malleshwaramkolar的数据,因此我想要在那里显示为 0

  • 用户选择的年份将给我所有城市名称,因此我想要循环遍历这里的其他日期数据,即array2

  • 日期最大的总是拥有所有城市名称

我的实现方法

var input = [
  ["Year", "2018-8", "2017-8"],
  ["JAYANAGAR", "2018-8", 10910665],
  ["MALLESHWARAM", "2018-8", 2018451],
  ["KOLAR", "2018-8", 2277562],
  ["JAYANAGAR", "2017-8", 1134]
]
var e = input[0]
var a = new Date(e[1]);

a.setMonth(a.getMonth());
a = a.toUTCString();

var c = a.split(' ');
e[1] = c[2] + " " + c[3];
a = new Date(e[2]);

a.setMonth(a.getMonth());
a = a.toUTCString();
c = a.split(' ');
e[2] = c[2] + " " + c[3];

const merged = input.reduce((acc, arr) => {
  const [city, year, value] = arr;

  if (city === "Year")
    acc[city] = arr
  else {
    acc[city] = acc[city] || [city]
    acc[city].push(value)
  }

  return acc;
}, {})

const output = Object.values(merged)
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我期望的输出

[
  [
    "Year",
    "Aug 2018",
    "Aug 2017"
  ],
  [
    "JAYANAGAR",
    10910665,
    1134
  ],
  [
    "MALLESHWARAM",
    2018451,
    0
  ],
  [
    "KOLAR",
    2277562,
    0
  ]
]

我相信七月是一年中的第七个月...难道不应该是“2018年八月”等吗? - Jack Bashford
6
你的代码中没有JSON。JSON是一种类似JS字面量的文本格式。你所拥有的是一个二维数组。 - user5734311
@JackBashford 因为浏览器的依赖关系,它将其识别为七月。 - user11176692
2
虽然它不是JSON! - Abhishek Gautam
@AbhishekGautam 好的,我已经编辑了我的帖子。 - user11176692
@ChrisG 我已经编辑了我的帖子,你能帮我回答一下吗? - user11176692
1个回答

2

这个解决方案创建一个对象来存储所有相同城市的数据,其中键是城市名称,然后创建另一个数组,将数组格式化为所需输出。

修改后:该解决方案可以通过按城市名称作为键值来将所有数据存储在一个对象中,接着创建一个新的数组,并对其进行格式化以满足所需输出的格式。

    var input = [
      ["Year", "2018-8", "2017-8"],
      ["JAYANAGAR", "2018-8", 10910665],
      ["MALLESHWARAM", "2018-8", 2018451],
      ["KOLAR", "2018-8", 2277562],
      ["JAYANAGAR", "2017-8", 1134]
    ];
    
   
  
  var cities = {};
  var years = input[0]; 

  
function formatDate(date, index){

if(index === 0){ //skip formatting, because it is not a date
  return date;
}
  dates = {
  '1' : 'Jan',
  '2' : 'Feb',
  '3' : 'Mar',
  '4' : 'Apr',
  '5' : 'May',
  '6' : 'Jun',
  '7' : 'Jul',
  '8' : 'Aug',
  '9' : 'Sep',
  '10': 'Oct',
  '11': 'Nov',
  '12': 'Dec'
  };

  let dateArr = date.split('-');

  return dates[dateArr[1]] + ' ' + dateArr[0];
 
}


years = years.map(formatDate); //run through dates array. 


  
  //store data in object items, where each key is city , and items are arrays of data
  input.forEach(function(element,index) {
    if(index !== 0){
    if( cities[element[0]] === undefined){
       cities[element[0]] = [];
    }
    
      cities[element[0]].push(element[2]); // add to city item new data
      
    }
  });
  

 var citiesData = []; 
 for (var city in cities) { //reformat the data in format [city, ...data]
    if (cities.hasOwnProperty(city)) {
      //  citiesData.push
     cities[city].unshift(city); //add city as first item in array
     if(years.length > cities[city].length){ //assuming that data should be available for each year, check the length and fill with zeroes 
     let fillsLength =  years.length -  cities[city].length;
     let fills = Array(fillsLength).fill(0, 0, fillsLength); //fill with zeros x times of missing data per each year
     cities[city] = cities[city].concat(fills); //concat array of zeros with city data
     }
     citiesData.push(cities[city]);
    }
}

citiesData.unshift(years);

console.log(citiesData); 

关于日期:比起使用Date和Date方法,更加简单的方法是使用对象来保存每个月份的缩写作为值,以及数字格式的月份作为键。

原始答案:最初的回答


这里我卡住了,我该如何按年份检查城市并将值设为0。 - user11176692
@dheerajkumar,第二层中每个数组的第三项是什么? - Nikola Kirincic
[城市,年份,数值] 这是我的数组中的三个项目。 - user11176692
@dheerajkumar,我已经用新代码编辑了我的答案。在这个解决方案中,你需要使用对象的帮助。 - Nikola Kirincic
@dheerajkumar,有什么问题吗?运行代码片段并检查结果。 - Nikola Kirincic
先生,您能帮我看一下这里吗?https://dev59.com/srPma4cB1Zd3GeqPrHgK - user11176692

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接