2016-11-07 2 views
0

У меня есть эта функция:Как получить последовательные пробелы в массиве Javascript

function insertValue2(cantidad, value, arr){ 

    var spaceCount = 0; 

    arr.forEach(function(item, index) { 
     if(item == "") { 
     console.log(index) 
     spacecount++; 
     } 
    }); 
    console.log(spaceCount) 

Моя функция подсчитывает пробелы в этом массиве: ["", "", "", "B", "B", "B", ""]

Так что результат для этого: 0 1 2 6 являются позиции в массив с пробелами и spacecount = 4

Я не знаю, возможно ли это, но любая идея, как подсчитать пробел, прежде чем я получу первый B ??

Я имею в виду рассчитывать на последовательных пустых пространств, как 0 1 2 spacecount = 3, а затем рассчитывать пространство для 6 spacecount = 1

И если я хочу, чтобы вставить в моем массиве quantity = 1 с value = C, который будет выбирать наименьшее значение для spacecount.

["", "", "", "B", "B", "B", "C"]

EDIT:

Количество, сколько пространства я буду использовать в массиве, я не хочу, чтобы использовать больше места, чем необходимо для количества

В этом массив i имеет пустое место в позициях 0, 1, 2, 7 , 8, 9, 10

["", "", "", "B", "B", "B", "C", "" , "" ,"" ,""]

, если я хочу, чтобы вставить quantity = 2 и value = D, ожидаемый результат:

["D", "D", "", "B", "B", "B", "C", "" , "" ,"" ,""]

, и если я хочу, чтобы вставить quantity = 1 and value = "E" будет выбрать position 2 с spacecount = 1, чтобы сохранить высокий spacecount для больше количество, как 3 или 4

["D", "D", "E", "B", "B", "B", "C", "" , "" ,"" ,""]

чем ks для справки :)

+0

Я не понимаю ваши примеры с количеством .. так что вы хотите, чтобы функция вернуть число последовательных пробелов и их позиции? Покажите нам, каков вход для функции и какой именно желаемый результат. – Buksy

+0

Выход есть: Таким образом, результат для этого: '0 1 2 6' - это позиции в массиве с пробелами и' spacecount = 4', я не знаю, что вы не понимаете: S – Eliott

+0

вы ищете письмо, или просто для космических групп? –

ответ

0

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

function insert(array, value, count) { 
 
    var i, 
 
     spaces = data.reduce(function (r, a, i, aa) { 
 
      if (a === '') { 
 
       if (aa[i - 1] === '') { 
 
        r[r.length - 1].count++; 
 
       } else { 
 
        r.push({ index: i, count: 1 }); 
 
       } 
 
      } 
 
      return r; 
 
     }, []), 
 
     index = spaces.reduce(function (r, a) { 
 
      return a.count < count || r.count < a.count ? r : a; 
 
     }, {}).index; 
 

 
    if (index !== undefined) { 
 
     for (i = 0; i < count; i++) { 
 
      array[i + index] = value; 
 
     } 
 
    } else { 
 
     // throw no space error 
 
    } 
 
} 
 

 
var data = ["", "", "", "", "B", "B", "B", "C", "", "", ""]; 
 

 
insert(data, 'X', 5); // throw no space error, if implemented 
 
console.log(data); // ["", "", "", "", "B", "B", "B", "C", "", "", ""] 
 

 
insert(data, 'D', 2); 
 
console.log(data); // ["", "", "", "", "B", "B", "B", "C", "D", "D", ""] 
 

 
insert(data, 'E', 1); 
 
console.log(data); // ["", "", "", "", "B", "B", "B", "C", "D", "D", "E"]
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Спасибо вам большое! Ты лучший!! – Eliott

0

Попробуйте использовать счетчик.

Я использовал счетчик для проверки, является ли im в пробеле или другом символе в первый раз. Если counter = 0 -> количество ++ и counter = 1; Кроме того, если цикл находит notwhitespace изменение счетчика снова 0.

var arr = ["", "", "", "B", "B", "B", "C", "" , "" ,"" ,""]; 

var spacecount=0; 
var quantity=0; 
var contador=0; 

arr.forEach(function(item, index) { 
    if(item == "") { 
    if(contador==0){ 
     quantity++; 
     contador=1; 
     spacecount=0; 
    } 
    spacecount++; 
    }else{ 
    contador=0; 
    } 
}); 

console.log('spacecount: '+spacecount); 
console.log('quantity: '+quantity); 
+0

У вас есть код между 'if' и' else' – Weedoze

+0

, чтобы проверить {}, что else для первого, если и код inse после второго if. – erNachete

+0

К сожалению, отступ грязный – Weedoze

2

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

Одним из способов было бы за счет расширения самого объекта массива: (см консоль для результатов)

Array.prototype.groupBy = function(value) { 
 
    var array = this; 
 
    var groups = []; 
 
    var buffer = []; 
 
    for (var i = 0; i < array.length; i++) { 
 
     var curItem = array[i]; 
 
     if (curItem == value) { 
 
      buffer.push(i); 
 
     } else if (buffer.length > 0) { 
 
      groups.push(buffer); 
 
      buffer = []; 
 
     } 
 
    } 
 
    if (buffer.length > 0) 
 
     groups.push(buffer); 
 
    return groups; 
 
}; 
 

 
var a = ["", "", "", "B", "B", "B", ""]; 
 
var consecutiveBlankSpaces = a.groupBy(""); 
 
console.log('total of ' + consecutiveBlankSpaces.length + ' groups of blank spaces'); 
 
for (var i = 0; i < consecutiveBlankSpaces.length; i++) { 
 
    console.log('Found a blank space group consisting of ' + 
 
     consecutiveBlankSpaces[i].length + ' items, indexes: ' + 
 
     consecutiveBlankSpaces[i]); 
 
}

+0

Действительно полезный :) – Eliott

0

var arr = ["", "", "", "B", "B", "B", "C", "", "", "", ""]; 
 

 
var groups = {}; 
 
var groupsIndex = 0; 
 
var previouslyUpgraded = false; 
 

 
arr.forEach(function(item, index) { 
 
    if (item === "") { 
 
    groups["group" + groupsIndex] = groups["group" + groupsIndex] || []; 
 
    groups["group" + groupsIndex].push(index); 
 
    previouslyUpgraded = false; 
 
    } else if (!previouslyUpgraded) { 
 
    groupsIndex++; 
 
    previouslyUpgraded = true; 
 
    } 
 
}); 
 

 
console.log(groups); 
 
console.log(Object.keys(groups).length + " groups found !"); 
 

 
for (var key in groups) { 
 
    console.log(key + " has empty string at indexes : " + groups[key]); 
 
}
.as-console-wrapper { 
 
    max-height: 100% !important; 
 
    top: 0; 
 
}

0

function CountSpaces(a) { 
 
    var result = []; 
 
    var positions = []; 
 
    
 
    for(var i = 0, len = a.length; i<len; i++) { 
 
    if(a[i] != "" && positions.length > 0) { 
 
     result.push({ 
 
     positions: positions, 
 
     count: positions.length 
 
     }); 
 
     
 
     positions = []; 
 
     lastCharacter = a[i]; 
 
     continue; 
 
    } 
 
    
 
    if(a[i] == "") positions.push(i); 
 
    } 
 
    
 
    if(positions.length > 0) { 
 
    result.push({ 
 
     positions: positions, 
 
     count: positions.length 
 
    }); 
 
    } 
 
    
 
    return result; 
 
} 
 

 
var a1 = ["", "", "B", "", "", "C", "D", "", "", ""]; 
 
console.log(a1, CountSpaces(a1));

Смежные вопросы