2017-02-24 2 views
0

정렬 된 배열이 주어지면 일치하는 요소의 배열을 포함하는 새로운 2 차원 배열을 만들고 싶습니다.배열에 일치하는 요소 그룹 지정

input = ['a','a','a','a','d','e','e','f','h','h','h','i','l','m','n','r','s','s','t','u','v','y','y'] 

output = [ ['a','a','a','a'], ['d'], ['e','e'], ['f'], ['h','h','h'], ['i'], ['l'], ['m'], ['n'], ['r'], ['s','s'], ['t'], ['u'], ['v'], ['y','y']] 
+1

당신은'당신이 질문에 시도 javascript'를 포함 할 수 있습니다? – guest271314

답변

1

당신은 전신을 확인하고 마지막 항목으로 밀어 전에 새 배열을 추가 할 수 있습니다 파이썬의 itertools.groupby

예의 동작과 유사. 비 분류 항목의

var input = ['a', 'a', 'a', 'a', 'd', 'e', 'e', 'f', 'h', 'h', 'h', 'i', 'l', 'm', 'n', 'r', 's', 's', 't', 'u', 'v', 'y', 'y'], 
 
    output = input.reduce(function (r, a, i, aa) { 
 
     if (aa[i - 1] !== a) { 
 
      r.push([]); 
 
     } 
 
     r[r.length - 1].push(a); 
 
     return r; 
 
    }, []); 
 
    
 
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

, 당신은 해시 테이블을 통해 폐쇄를 사용할 수 있습니다.

var input = ['a', 'a', 'a', 'a', 'y', 'h', 'h', 'i', 'l', 'e', 'e', 'f', 'h', 'm', 'n', 'r', 's', 'y', 'd', 's', 't', 'u', 'v'], 
 
    output = input.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a]) { 
 
       hash[a] = []; 
 
       r.push(hash[a]); 
 
      } 
 
      hash[a].push(a); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 
    
 
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

당신은 일치 RegExp/([a-z]+)(?=\1)\1|[^\1]/g와 매개 변수 "", String.prototype.match()Array.prototype.join()을 사용할 수있는 하나 이상의 "z" 통해 "a" 캡처 문자 다음에, 또는 그룹 .map()을 캡처되지, .split()

var input = ['a', 'a', 'a', 'a' 
 
      , 'd', 'e', 'e', 'f' 
 
      , 'h', 'h', 'h', 'i' 
 
      , 'l', 'm', 'n', 'r' 
 
      , 's', 's', 't', 'u' 
 
      , 'v', 'y', 'y']; 
 

 
var res = input.join("").match(/([a-z]+)(?=\1)\1|[^\1]/g).map(c => c.split("")); 
 

 
console.log(res);

0

참고 :이 배열 정렬되지 않은 경우에도 작동합니다 :

var input = ['a','b','c','d','a','d','e','e','f','h','h','h','i','l','m','n','r','s','s','t','u','v','y','y']; 
 

 

 
function group(arr) { 
 
    var hash = {}; 
 
    return arr.reduce(function(res, e) { 
 
    if(hash[e] === undefined)   // if we haven't hashed the index for this value 
 
     hash[e] = res.push([e]) - 1; // then hash the index which is the index of the newly created array that is initialized with e 
 
    else        // if we have hashed it 
 
     res[hash[e]].push(e);   // then push e to the array at that hashed index 
 
    return res; 
 
    }, []); 
 
} 
 

 
console.log(group(input));

+0

['Array # reduce'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)에는 'thisArg'가 없습니다. –

+0

@NinaScholz oops! 나는 그들이 모두 똑같을 것 같아! –