Я пытаюсь создать некоторые необработанные данные для диаграммы, и я столкнулся с проблемой, которую я не могу решить.
У меня есть массив с вложенными массивами, который содержит данные для оси 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]);
}
Надеюсь, кто-то поймет мою проблему.
Решение 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]]*/
Вы можете получить генерируемое 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]);
}
}
Попробуйте это
for(var i; i < questions.length;i++)
{
if (typeof generatedData[i,0] !== 'undefined' && generatedData[i,0] !== null)
{
generatedData.push([i,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;
};