2016-11-04 77 views
2

我有一个数组,看起来像:从两个阵列组合值在JavaScript

var data = [{"year":[1981],"weight":[3]}, 
      {"year":[1982],"weight":[4]}, 
      {"year":[1985],"weight":[7]}] 

我的数据系列,1980年开始,以一年1986年结束我的任务是输入所有缺失值到数组;在我的情况下,最终阵列应该是:

var data = [{"year":[1980],"weight":[0]}, 
      {"year":[1981],"weight":[3]}, 
      {"year":[1982],"weight":[4]}, 
      {"year":[1983],"weight":[0]}, 
      {"year":[1984],"weight":[0]}, 
      {"year":[1985],"weight":[7]}, 
      {"year":[1986],"weight":[0]}] 

我在两个步骤中实现了这个任务。首先,我创建了一个长度为七个元素(1980 - 1986年)的空数组,并初始化每个元素的值为{"year": $CURRENT_YEAR, "weight": 0}。然后,我循环访问data数组,在空数组中找到当前年份的索引,并用当前值替换yearweight字段。我的代码粘贴在下面。

我不知道代码是否可以用更优雅的方式重写。

// Create empty array 
var my_array = [] 
var length = 7 

// 1st step 
year = 1980 
for (var i = 0; i < length; i++) { 
    my_array.push({"year": year, "weight": 0}); 
    year++ 
} 

// 2nd step 
for (var j = 0; j < data.length; j++) { 
    curr_year = data[j]["year"][0]; 
    curr_weight = data[j]["weight"][0] 
    var index = my_array.findIndex(function(item, i) {return item.year === curr_year}) 
    my_array[index] = {"year": curr_year, "weight": curr_weight} 
} 
+0

为什么在阵列中的值,如[1981]和[3]?你打算存储更多的价值吗?我发现你的代码在第一步中并没有将值存储为数组,但是它在第二步中部分地完成了。所以二者之一是错误的。你的代码不能像那样工作。 – trincot

+0

“我想知道代码是否可以用更优雅的方式重写。” - 如果这是你的问题,是不是应该发布到[codereview](http://codereview.stackexchange.com/)? – evolutionxbox

+0

那么,代码显然没有做OP的要求,所以我认为这个问题真的应该改写为*“这是行不通的,因为我得到了这个结果(....),而不是所期望的结果(...)。 我做错了什么?”*。不适用于CodeReview。 – trincot

回答

2

这是最好的.map()做这个工作再说,如果你有一个大的输入数组它可能是明智的建立首先如哈希(LUT);

var data = [{"year":[1981],"weight":[3]}, 
 
      {"year":[1982],"weight":[4]}, 
 
      {"year":[1985],"weight":[7]}], 
 
    lut = data.reduce((p,c) => p[c.year[0]] ? p : (p[c.year[0]] = c, p), {}); 
 
    range = [1980,1986], 
 
    result = Array(range[1]-range[0] + 1).fill() 
 
             .map((_,i) => lut[i+range[0]] ? lut[i+range[0]] : {year: [i+range[0]], weight: [0]}); 
 
console.log(result);

1

您可以组合2路和做两个步骤在一个循环中的数组元素的

// Create empty array 
var my_array = [] 
var length = 7 


year = 1980 
for (var i = 0; i < length; i++) { 
    // check if there is data for the year 
    var index = data.findIndex(function(item, i) {return item.year === year}); 
    if(index > -1){ //if there is data, use it 
     my_array.push({"year": data[index]["year"][0], "weight": data[index]["weight"][0]}); 
    }else{ //put in default data 
     my_array.push({"year": year, "weight": 0}); 
    } 
    year++; 
} 
1

查找指数每一次对大数据的糟糕表现。我可以建议如下算法:

// Create empty object and fill it with values where keys are years 
var years = {}; 
data.forEach(item => { 
    years[item.year[0]] = item.weight[0]; 
}); 

// Result array with all years 
var result = []; 
var startYear = 1980; 
var endYear = 1986; 

// Generate our result array 
for (var i = startYear; i <= endYear; i++) { 

    // If property for given year (i) exists in "years" object then add it to "result" array 
    // in other case add default object with weight 0 
    var o = years[i] ? { year: [i], weight: [years[i]] } : { year: [i], weight: [0] }; 
    result.push(o); 
} 
1

你可以只用find()while循环做到这一点。

var data = [{"year":[1981],"weight":[3]},{"year":[1982],"weight":[4]},{"year":[1985],"weight":[7]}]; 
 
        
 
var i = 1980; 
 
var result = []; 
 

 
while(i <= 1986) { 
 
    var find = data.find(e => e.year[0] == i); 
 
    (find) ? result.push(find) : result.push({year: [i], weight: [0]}); 
 
    i++; 
 
} 
 

 
console.log(result)

你也可以先用map()获得的年数组,然后使用while循环与indexOf()

var data = [{"year":[1981],"weight":[3]},{"year":[1982],"weight":[4]},{"year":[1985],"weight":[7]}]; 
 
      
 
var i = 1980; 
 
var result = []; 
 
var years = data.map(e => e.year[0]); 
 

 
while(i <= 1986) { 
 
    var ind = years.indexOf(i); 
 
    (ind != -1) ? result.push(data[ind]) : result.push({year: [i], weight: [0]}); 
 
    i++; 
 
} 
 

 
console.log(result)