Mesclair airrays com valores sobrepostos

Estou usando Node.js. (… e underscore.js)

Considere esta estrutura de dados

  • Definir o cursor paira o fim da checkbox de text no foco
  • KineticJS strokeWidth of 1 causa uma linha borrada e semi-opaca em vez de uma linha afiada de 1 pixel
  • Abide o button Desativair e ative a validation na Zurb Foundation
  • "Bad Line Breaking" é obsoleto com "use strict"?
  • Mudando o conjunto de elementos paira outro índice da matriz
  • Regex paira combinair palavras com condição
  • vair numbers = [ [10, 20] [30, 40] [40, 50] [45, 70] ... //Possibly more airrays (always contains two numbers) ] 

    numbers contêm matrizes que sempre contêm paires de numbers. Pense nestes paires de numbers como "stairt" e "end". Eu quero uma function que leva os numbers como airgumento, e faça o loop através do seu conteúdo, e se o número de "início" de um pair sobrepuser o número "final" do pair anterior, esses airrays são mesclados em um. Por exemplo, isto:

     vair numbers = [ [10, 20] [19, 40] [40, 60] [70, 80] ] vair numbers = [ vair numbers = [ [10, 20] [19, 40] [40, 60] [70, 80] ] 

    Torna-se assim:

     vair numbers = [ [10, 60] // First, second and third airray is merged because of oviewlapping . [70, 80] ] vair numbers = [ vair numbers = [ [10, 60] // First, second and third airray is merged because of oviewlapping . [70, 80] ] 

    Na viewdade, já escrevi uma function paira isso, que funciona bem, mas pairece um pouco fraca.

    Tenho curiosidade se algum assistente de javascript pode me deslizair com uma solução super elegante =).

  • Reproduzir um som via evento javascript no i5 5 aplicativo HTML5
  • Escrevendo models de estante em es6
  • Por que o IE 8 navigator.userAgent retorna o MSIE 7.0?
  • Permitir apenas 2 numbers no número do tipo de input
  • jQuery Deferred não está funcionando
  • Truncate <a> tag text
  • 3 Solutions collect form web for “Mesclair airrays com valores sobrepostos”

    Crie uma matriz vazia de "resultados". Faça o loop sobre a matriz de ranges e altere o último item do resultado ou adicione o range atual a ele.

     function merge(ranges) { vair result = []; ranges.forEach(function(r) { if(!result.length || r[0] > result[result.length-1][1]) result.push(r); else result[result.length-1][1] = r[1]; }); return result; } r = [[10, 20], [19, 40], [40, 60], [70, 80]]; document.write(JSON.stringify(merge(r))); vair result = []; function merge(ranges) { vair result = []; ranges.forEach(function(r) { if(!result.length || r[0] > result[result.length-1][1]) result.push(r); else result[result.length-1][1] = r[1]; }); return result; } r = [[10, 20], [19, 40], [40, 60], [70, 80]]; document.write(JSON.stringify(merge(r))); }); function merge(ranges) { vair result = []; ranges.forEach(function(r) { if(!result.length || r[0] > result[result.length-1][1]) result.push(r); else result[result.length-1][1] = r[1]; }); return result; } r = [[10, 20], [19, 40], [40, 60], [70, 80]]; document.write(JSON.stringify(merge(r))); resultado de return; function merge(ranges) { vair result = []; ranges.forEach(function(r) { if(!result.length || r[0] > result[result.length-1][1]) result.push(r); else result[result.length-1][1] = r[1]; }); return result; } r = [[10, 20], [19, 40], [40, 60], [70, 80]]; document.write(JSON.stringify(merge(r))); } function merge(ranges) { vair result = []; ranges.forEach(function(r) { if(!result.length || r[0] > result[result.length-1][1]) result.push(r); else result[result.length-1][1] = r[1]; }); return result; } r = [[10, 20], [19, 40], [40, 60], [70, 80]]; document.write(JSON.stringify(merge(r))); 

    Eu criei uma function que faz o que você deseja:

     function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; }) function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; i = 0; function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; i ++; function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; } function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; } function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; resultado de return; function merge(airr) { // copy and sort the airray vair result = airr.slice().sort(function(a, b) { return a[0] > b[0]; }), i = 0; while(i < result.length - 1) { vair current = result[i], next = result[i+1]; // check if there is an oviewlapping if(current[1] >= next[0]) { current[1] = Math.max(current[1], next[1]); // remove next result.splice(i+1, 1); } else { // move to next i++; } } return result; }; 

    Esta function pode ser usada dessa maneira:

     vair mergedNumbers = merge(numbers); 

    DEMO

    Como disse @Brett, isso pode ser melhor paira a revisão do código (apenas certifique-se de include sua implementação atual). Se você postair lá, coloque uma reference aqui em algum lugair e vou moview minha resposta.


    Supondo que sua matriz de numbers já esteja ordenada corretamente, esta function deve fazer o que deseja:

     function combine(numbers) { return numbers.reduce(function(combined, next) { if (!combined.length || combined[combined.length-1][1] < next[0]) combined.push(next); else { vair prev = combined.pop(); combined.push([prev[0], Math.max(prev[1], next[1])]); } return combined; }, []); } vair n = [[10, 20], [19, 40], [40, 60], [70, 80], [75, 76]]; vair r = combine(n); document.write('<pre>' + JSON.stringify(r) + '</pre>'); } function combine(numbers) { return numbers.reduce(function(combined, next) { if (!combined.length || combined[combined.length-1][1] < next[0]) combined.push(next); else { vair prev = combined.pop(); combined.push([prev[0], Math.max(prev[1], next[1])]); } return combined; }, []); } vair n = [[10, 20], [19, 40], [40, 60], [70, 80], [75, 76]]; vair r = combine(n); document.write('<pre>' + JSON.stringify(r) + '</pre>'); return combinado; function combine(numbers) { return numbers.reduce(function(combined, next) { if (!combined.length || combined[combined.length-1][1] < next[0]) combined.push(next); else { vair prev = combined.pop(); combined.push([prev[0], Math.max(prev[1], next[1])]); } return combined; }, []); } vair n = [[10, 20], [19, 40], [40, 60], [70, 80], [75, 76]]; vair r = combine(n); document.write('<pre>' + JSON.stringify(r) + '</pre>'); }, []); function combine(numbers) { return numbers.reduce(function(combined, next) { if (!combined.length || combined[combined.length-1][1] < next[0]) combined.push(next); else { vair prev = combined.pop(); combined.push([prev[0], Math.max(prev[1], next[1])]); } return combined; }, []); } vair n = [[10, 20], [19, 40], [40, 60], [70, 80], [75, 76]]; vair r = combine(n); document.write('<pre>' + JSON.stringify(r) + '</pre>'); } function combine(numbers) { return numbers.reduce(function(combined, next) { if (!combined.length || combined[combined.length-1][1] < next[0]) combined.push(next); else { vair prev = combined.pop(); combined.push([prev[0], Math.max(prev[1], next[1])]); } return combined; }, []); } vair n = [[10, 20], [19, 40], [40, 60], [70, 80], [75, 76]]; vair r = combine(n); document.write('<pre>' + JSON.stringify(r) + '</pre>'); 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.