Javascript / Jquery - 填充缺少条目的数组

时间:2013-12-16 10:32:27

标签: javascript jquery arrays

我正在尝试为图表生成一些原始数据,而我遇到了一个我无法解决的问题。

我有一个包含嵌套数组的数组,其中包含x / y轴的数据

它是根据问题的给定答案生成的,现在可能没有答案的答案,因此它们不会显示在数据中。

让它更容易理解:

questions.length = 5

generatedData = [[3,2],[1,3]]

wantToHaveData = [[0,0],[1,3],[2,0],[3,2],[4,0]]

所以我需要一种方法来在生成的数据中插入所有缺失的数据以实现questions.length

如果我迭代地遍历数组并搜索现有值,那么x轴和y轴之间存在差异,例如:

for(var i; i < questions.length;i++){
   if( $.inArray( i, generatedData ) == -1) { // how to let this check only the first entry of nested array ? 
      generatedData.push([i,0]);
   }

我希望有人理解我的问题。

4 个答案:

答案 0 :(得分:1)

您可以生成 x 这样的内容

var generatedX = generatedData.map(function(point){return point[0]}); // [3,1]

然后像这样使用循环

for(var i=0; i < questions.length;i++){
    if( $.inArray( i, generatedX ) == -1) { 
        generatedData.push([i,0]);
    }
}

答案 1 :(得分:1)

解决方案1:您可以使用原生Array.prototype.some()方法

for(var i = 0; i < questions.length;i++){
    if( !generatedData.some(function(datapoint){ return datapoint[0] == i})) {
      generatedData.push([i,0]);
   }
}
/*generatedData = [[3, 2], [1, 3], [0, 0], [2, 0], [4, 0]]*/

解决方案2:但是,我更愿意构建一个默认值数组,然后填写生成的数组。这样,数据点按顺序返回,性能应该更好。

/* Construct array of default values. [[0,0], [1,0], ...[n,0]]*/
filledData = Array.apply(null, new Array(5)).map(function(elem, idx){return [idx, 0];});
for(var i = 0; i < generatedData.length; i++){
    filledData[generatedData[i][0]] = generatedData[i];
}
/*filledData = [[0, 0], [1, 3], [2, 0], [3, 2], [4, 0]]*/

答案 2 :(得分:0)

试试这个

for(var i; i < questions.length;i++)
{
    if (typeof generatedData[i,0] !== 'undefined' && generatedData[i,0] !== null)
    {    
        generatedData.push([i,0]);
    }
}

答案 3 :(得分:0)

我错过了jQuery标签,这是实现填充的本地JS方式:

function fill(arr, size){
    var tmpArray = [];
    var indexes = arr.map(function(e,i){
        return {"i":e[0], "e":e};
    });

    for(var i = 0; i < size; i++){
        var selected = indexes.filter(function(e){
           return e.i == i;
        });
        if(selected.length){
            for(var x = 0; x < selected.length; x++){
                tmpArray.push(selected[x].e);
            }
        }else{
            tmpArray.push([i,0]);
        }
    }
    return tmpArray;
};