kotran
726
2017-10-18 15:55:22
8
1150

자바스크립트 배열을 변경하는 알고리즘..



위와같은 배열이있습니다...

서울이 2,3,4번째 배열에 있고 아이콘이 각각에 대해 있는데..

이걸 하나로 합치려고 하는데 좋은 방법이 안떠오르네요.

for문으로 일단 배열을 다 돌린후에, 배열의 이름이 다 같은지 비교해서 같으면..

기존의 아이콘에다가 +","+로 해서 쉼표를 구분자로 해서 아이콘을 넣고자 합니다. 

for(var i=0; i<metro.length; i++){
// if(metro[i].name==)
}
0
0
  • 답변 8

  • 초코쪼꼬
    6k
    2017-10-18 15:57:22

    합친뒤의 모습이 어떻게 되나요? 글로 써줘보세요.

    0
  • 재미없다~
    1k
    2017-10-18 16:04:28

    1. 새로운배열을 만든다

    2. 새로운 배열에 name이 있느지 확인한다

    3 - 1. 없으면 그대로 배열에 넣는데

    3 - 2. name이 있으면 꺼내서 icon에 붙여 넣는다

    1
  • kotran
    726
    2017-10-18 16:04:48

    {name : 서울대입구 icon : 2 },

    {name : 서울 icon : A,1,4},

    {name : 서울(경의중앙선), icon : K},

    {name : 서울숲 , icon: 4}


    입니다!

    0
  • 초코쪼꼬
    6k
    2017-10-18 16:33:57

    테스트는 많이 못해봤어요.. 이런느낌이면 되지 않을까 싶긴한데 -_-; 소스가 좀 더럽네요..

    for(var i in arr){
     if(arr.filter((a,b) => a.name == arr[i].name).length != 1){
      var result = arr.filter((a,b) => a.name == arr[i].name).map(c => c.icon).join(",");

      arr.splice(i, 1);

      if(arr[i].name == arr[i+1].name)
       arr[i].icon = result;
     }
    }


    1
  • kotran
    726
    2017-10-18 16:37:44 작성 2017-10-18 16:38:22 수정됨

    감사합니당 ㅋㅋ 

    아래처럼 해결하긴 했는데 수송대원님거가 훨씬 더 멋지네요 보완해서 정리해야겠습니다. 감사합니다.


    var newarray=[];
    var narray=[];
    for(var i=0; i<metro.length; i++){
    newarray.push(metro[i].name);
    newarray=Array.from(new Set(newarray))
    }
    console.log(newarray); //유니크한 역이름만 있음.

    for(var i=0; i<newarray.length; i++){
    narray.push({name:newarray[i],icon:""})
    }
    console.log(narray); //유니크한 역이름을 name, 아이콘은 일단 공백으로
    for(var i=0; i<metro.length; i++){
    for(var j=0; j<narray.length; j++){
    if(metro[i].name==narray[j].name){
    console.log("일치한다"+j);
    narray[j].icon=narray[j]+","+metro[i].icon;
    }
    }
    }
    console.log(narray);
    0
  • tpe4
    110
    2017-10-18 17:02:06 작성 2017-10-18 17:02:21 수정됨

    라이브러리를 사용하지 않는다면 이렇게 하는게 가장 간편하겠네요... 다만 IE에서는 안됩니다


    var objs = [{name: "서울대입구", icon: "2"}, {name: "서울", icon: "A"}, {name: "서울", icon: "1"}, {name: "서울", icon: "4"}, {name: "서울숲", icon: "B"}]
    Object.entries(objs.reduce((acc, v) => { acc[v.name] = v.name in acc ? acc[v.name] + "," + v.icon : v.icon return acc }, {})).reduce((acc, v) => acc.concat({name: v[0], icon: v[1]}), [])
    1
  • 초코쪼꼬
    6k
    2017-10-18 17:03:21

    es6가 모든기능은 아니지만.. ie에서도 babel.js 를 import 시키면 됩니다.

    1
  • 푸르게
    557
    2017-10-18 18:50:57

    # lodash 4.17 용



    var arr = [{name : '서울대입구', icon : '2' },
    
    {name : '서울', icon : 'A'},
    {name : '서울', icon : '1'},
    {name : '서울', icon : '4'},
    
    {name : '서울(경의중앙선)', icon : 'K'},
    
    {name : '서울숲' , icon: '4'}];
    
    var group = _(arr).groupBy('name').map(function(items, key) {
      var rst = items.map(function(item) { return item.icon; });
      return {name: key, icon: rst};
    }).value();
    
    console.log(JSON.stringify(group, null, 4));


    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.