Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中组合来自两个数组的值_Javascript_Arrays - Fatal编程技术网

在JavaScript中组合来自两个数组的值

在JavaScript中组合来自两个数组的值,javascript,arrays,Javascript,Arrays,我有一个数组,看起来像: var data = [{"year":[1981],"weight":[3]}, {"year":[1982],"weight":[4]}, {"year":[1985],"weight":[7]}] 我的数据系列从1980年开始,到1986年结束。我的任务是将所有缺少的值输入数组;在我的情况下,最终数组应该是: var data = [{"year":[1980],"weight":[0]},

我有一个数组,看起来像:

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}
初始化每个元素。然后我循环遍历
数据
数组,在空数组中查找当前年份的索引,并用当前值替换
年份
权重
字段。我的代码粘贴在下面


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

// 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}
}
//创建空数组
var my_数组=[]
变量长度=7
//第一步
年份=1980年
对于(变量i=0;i
您可以将两个循环组合在一起,并在一个循环中执行这两个步骤

// 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++;
}
//创建空数组
var my_数组=[]
变量长度=7
年份=1980年
对于(变量i=0;i-1){//如果有数据,请使用它
my_array.push({“年”:数据[索引][“年”][0],“权重”:数据[索引][“权重”][0]});
}else{//放入默认数据
my_array.push({“year”:year,“weight”:0});
}
年份++;
}

每次查找数组中元素的索引对于大数据来说性能很差。我可以建议以下算法:

// 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);
}
//创建空对象,并在键为年的位置填充值
var年={};
data.forEach(项=>{
年[项目年[0]]=项目重量[0];
});
//所有年份的结果数组
var结果=[];
var startYear=1980;
var endYear=1986年;
//生成我们的结果数组

对于(var i=startYear;i您可以使用
find()
while
循环来实现这一点

var数据=[{“年”:[1981],“权重”:[3],{“年”:[1982],“权重”:[4],{“年”:[1985],“权重”:[7]}];
var i=1980;
var结果=[];
而(即年[0]==i);
(查找)?result.push(查找):result.push({year:[i],weight:[0]});
i++;
}

console.log(result)
最好通过
.map()
完成这项工作,此外,如果您有一个大的输入数组,最好首先设置一个哈希(lut),例如

var数据=[{“年”:[1981],“权重”:[3]},
{“年”:[1982],“重量”:[4]},
{“年”:[1985],“重量”:[7]}],
lut=data.reduce((p,c)=>p[c.year[0]]?p:(p[c.year[0]]=c,p),{});
范围=[19801986],
结果=数组(范围[1]-范围[0]+1).fill()
.map((_,i)=>lut[i+范围[0]]?lut[i+范围[0]]:{年份:[i+范围[0]],权重:[0]});

console.log(result);
为什么您的值在数组中,比如[1981]和[3]?您打算在数组中存储更多值吗?我看到您的代码在第一步中没有将值存储为数组,但在第二步中部分存储为数组。因此,这两个值中的一个是错误的。您的代码不能这样工作。“我想知道是否可以用一种更优雅的方式重写代码。”-如果这是你的问题,这是否应该发布到?嗯,代码显然没有达到OP的要求,所以我认为问题应该改为“这不起作用,因为我得到了这个结果(…),而不是期望的结果(…)。我做错了什么?“。不用于代码复查。