2014-01-08 3 views
1

У меня есть массивJavascript строка преобразования

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 

(Это Javascript); я не знаю, как преобразовать этот массив в выходной:

["2:6,3", "1:1,2", "3:1"]; 

Может быть вы можете мне помочь?

+2

Что логика преобразования? –

+0

Mabye вы должны рассказать нам больше о том, как вы получили этот результат ... – dburner

+0

Это группа по первому номеру перед «:» – user889349

ответ

3

Похоже, что вы хотите, чтобы сгруппировать элементы списка, которые имеют ту же самую начальную цифру. Этот код даст вам ассоциативный массив {"1":"1,2","2":"6,3","3§:"1"} в качестве выхода:

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 
    var hist = {}; 
    arr.map(function (a) { b=a.split(":");c=b[0]; if (c in hist) hist[c]=hist[c].concat(","+b[1]); else hist[c] = b[1]; }); 
    alert(JSON.stringify(hist)); 

Смотрите также JavaScript Group By Array

+1

Ницца, чему-то научился сегодня , :-) –

+0

СПАСИБО! Отличное решение. – user889349

1
var interm = {}, output = [], regx = /(\d+):(\d+)/; 
arr.forEach(function(x) {var y = regx.exec(x); if (y[1] in interm) interm[y[1]].push(y[2]); else interm[y[1]] = [y[2]]}); 
Object.keys(interm).map(function(x) { output.push(x + ":" + interm[x].join(',')) }); 

console.log(output); 

[ '1:1,2', '2:6,3', '3:1' ] 

Это далеко от наиболее эффективного преобразования с точки зрения скорости, как он использует регулярные выражения и forEach, но это довольно кратким, и вы не говоря уже о том, что вам нужно что-нибудь особенно быстро.

+0

сладкое решение тоже ... –

0

Ваш выход очень похож на карту. Я бы написать:

{ 
    2 : [ 6, 3 ], 
    1 : [ 1, 2 ], 
    3 : [ 1 ] 
} 

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

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 
var map = {}; 
arr.forEach(function(item){ 
    var split = item.split(':'); 
    if (!map[split[0]]) map[split[0]] = [split[1]]; 
    else map[split[0]].push(split[1]); 
}); 

Очевидно, что с моей карты вы можете получить желаемый массив довольно легко:

var result = []; 
for (var key in map) { 
    if (map.hasOwnProperty(key)) // best practice 
    result.push(key+':'+map[key]); 
} 

console.log(result); // ["1:1,2", "2:6,3", "3:1"] 

Одно примечание: он не имеет элементы в том же порядке, что вы делаете, но это можно легко исправить по не итерация исходного массива, чтобы получить ключи вместо for..in:

var result = []; 
arr.forEach(function(item){ 
    var key = item.split(':')[0]; 
    if (map[key]) { 
    result.push(key+':'+map[key]); 
    delete map[key]; // destroys the map! 
    } 
}); 

console.log(result); // ["2:6,3", "1:1,2", "3:1"] 

решение 2 (без промежуточного карта):

Это решение имеет O (N^2) Сложность:

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 

var result = []; 
for (var i=0; i<arr.length; i++) { 
    if (!arr[i]) continue; 
    var key = arr[i].split(':')[0]; 
    var values = []; 
    for (var j=i; j<arr.length; j++) { 
    var split = arr[j].split(':'); 
    if (split[0] === key) { 
     values.push(split[1]); 
     arr[j] = undefined; // destroys the original array 
    }   
    } 
    result.push(key + ':' + values); 
} 

console.log(result); // ["2:6,3", "1:1,2", "3:1"] 
0

Вот рабочий пример на JSFiddle

И пример кода ниже,

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 
var tdarray = {}; 
var newarray = []; 

for(var i=0;i<arr.length;i++){ 
    var data = arr[i].split(":"); 
    var found = false; 
    for(var key in tdarray){ 
     if(data[0]==key){ 
      found = true; 
      break; 
     } 
    } 
    var list=[]; 
    if(found){ 
     list = tdarray[data[0]]; 
    } 
    list.push(data[1]); 
    tdarray[data[0]] = list; 
} 
for(key in tdarray){ 
    var data = key + ":" + tdarray[key].join(); 
    newarray.push(data); 
} 

console.log(newarray); 
0

И еще одно возможное решение ...

var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"], alreadyUsedNumbers = []; 
for (var i=0; i < arr.length; i++) { 
    var key = arr[i].split(":")[0], value = arr[i].split(":")[1]; 

    if (alreadyUsedNumbers.indexOf(key) >= 0) { 
    for (var j=0; j < i; j++) { 
     if (arr[j].indexOf(key) == 0) { 
      arr[j] += ","+value; 
      arr.splice(i, 1) 
      i--; 
      break; 
     } 
    } 
    } else { 
     alreadyUsedNumbers.push(key); 
    } 
} 
console.log(arr); 

... наслаждаться.

1

Пожалуйста, ознакомьтесь LINK..

или применять ниже код ...

HTML код ...

<input type='button' id='s' value='test' onclick="test()"/> 

JQuery код ...

function test() { 

    var arr = ["2:6", "2:3", "1:1", "1:2", "3:1"]; 
    var resultStr = ""; 

    for (i = 0; i < arr.length; i++) { 

     if (i <= arr.length - 2) { 
      var a = arr[i + 1].split(":"); 
      if (a.length > 0) { 
       resultStr += arr[i] + ',' + a[1] + ' | '; 
      } 
     } else { 
      var str = arr[i]; 
      resultStr += arr[i]; 
     } 
     i++; 
    } 

    alert(resultStr); 
} 
0
var arr = ["2:6", "2:3", "1:1", "1:2", "3:1", "4:6", "3:4"]; 
var output = new Array(); 
var outputString = "["; 

for(var i=0; i<arr.length; i++) 
{ 
    var index = arr[i].indexOf(":"); 
    var firstNr = arr[i].substring(0,index); 
    var secondNr = arr[i].substring(index+1,arr[i].length); 

    var outputPart = firstNr + ":" + secondNr; 
    var j = i+1; 
    while (j<arr.length) 
    { 
     var index2 = arr[j].indexOf(":"); 
     var firstNr2 = arr[j].substring(0,index2); 
     var secondNr2 = arr[j].substring(index2+1,arr[j].length); 
     if (firstNr == firstNr2) 
     { 
      outputPart += "," + secondNr2; 
      arr.splice(j,1); 
     } 
     else 
      j++; 
    } 
    output.push(outputPart); 
} 
for(var k=0; k<output.length; k++) 
    outputString += "'" + output[k] + "' "; 
outputString += "]"; 
alert(outputString); 

Демо здесь: http://jsfiddle.net/er144/QYca2/

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