Javascript / Jquery - заполнить массив недостающими записями

0

Я пытаюсь создать некоторые необработанные данные для диаграммы, и я столкнулся с проблемой, которую я не могу решить.

У меня есть массив с вложенными массивами, который содержит данные для оси x/y

И он генерируется из заданных ответов на вопрос, теперь есть ответы, на которые не отвечают, поэтому они не отображаются в данных.

Чтобы было легче понять:

questions.length = 5

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

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

поэтому мне нужен способ вставить все отсутствующие данные в сгенерированные данные для выполнения questions.length

Если я итеративно перехожу через массив и ищу существующие значения, у меня есть проблема разницы между осью х и осью 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]);
   }

Надеюсь, кто-то поймет мою проблему.

Теги:
arrays

4 ответа

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]]*/
  • 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]);
    }
}
0

Попробуйте это

for(var i; i < questions.length;i++)
{
    if (typeof generatedData[i,0] !== 'undefined' && generatedData[i,0] !== null)
    {    
        generatedData.push([i,0]);
    }
}
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;
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню