>

ID가 같은 경우 값을 배열에 병합하고 싶습니다. 이와 같은 객체 배열이 하나 있습니다.

[ 
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Rosie',
 },
 { 
   id: 'Jane',
   type: 'human',
   favorite: null,
 },
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Lisa',
 },
 { 
   id: 'Steve',
   type: 'hero',
   favorite: 'Jennie',
 },
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Jisoo',
 },
]


favorite 를 병합하고 싶습니다  문자열에서 배열로. 이런 식으로 출력하고 싶습니다

[ 
 { 
   id: 'Tony',
   type: 'hero',
   favorite: ['Rosie', 'Lisa', 'Jisoo'],
 },
 { 
   id: 'Jane',
   type: 'human',
   favorite: null,
 },
 { 
   id: 'Steve',
   type: 'hero',
   favorite: ['Jennie'],
 }

그리고 다음과 같은 코드를 작성하려고합니다. (from : Sum 객체 배열의 유사한 키 )

var obj = [
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Rosie',
    },
    {
      id: 'Jane',
      type: 'human',
      favorite: null,
    },
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Lisa',
    },
    {
      id: 'Steve',
      type: 'hero',
      favorite: 'Jennie',
    },
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Jisoo',
    },
  ];
  var holder = {};
  const ar = []
  obj.forEach(function (d) {
    if (holder.hasOwnProperty(d.id)) {
      holder[d.id] = ar.push(holder[d.id] + d.favorite);
    } else {
      holder[d.id] = d.favorite;
    }
  });
  var obj2 = [];
  for (var prop in holder) {
    obj2.push({ name: prop, favorite: holder[prop] });
  }
  console.log(obj2);


하지만 내놓는 것은

[ { name: 'Tony', favorite: 2 },
  { name: 'Jane', favorite: null },
  { name: 'Steve', favorite: 'Jennie' } ]

어떻게하면 되나요?

  • 답변 # 1

    단일 Array.reduce로이 작업을 수행 할 수 있으며 가장 간단하고 성능이 좋은 방법 일 것입니다 :

    var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ]
    let result = data.reduce((r, {id,type,favorite}) => {
      r[id] = r[id] || {id, type, favorite: []}
      r[id].favorite.push(favorite)
      return r
    }, {})
    console.log(Object.values(result))
    
    

    아이디어는 id 를 "그룹화"하는 것입니다.  그런 다음 favorites 에 계속 밀어  각 반복마다 배열.

    와이즈 비즈  비슷한 방식으로 할 수 있습니다 :

    ES5
    
    

    정말로 var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ] let result = data.reduce(function(r, c){ r[c.id] = r[c.id] || {id: c.id, type: c.type, favorite: []} r[c.id].favorite.push(c.favorite) return r }, {}) console.log(Object.values(result)) 가 필요 없습니다  이것을 달성하기 위해.

  • 답변 # 2

    lodash 그룹   id 와 함께 _.group() 를 사용하여 각 그룹을 병합하십시오.  그리고 _.map() _.mergeWith() 를 수집  배열로 :

    favorite
    
    

    const data = [{"id":"Tony","type":"hero","favorite":"Rosie"},{"id":"Jane","type":"human","favorite":null},{"id":"Tony","type":"hero","favorite":"Lisa"},{"id":"Steve","type":"hero","favorite":"Jennie"},{"id":"Tony","type":"hero","favorite":"Jisoo"}]
    const result = _(data)
      .groupBy('id')
      .map(g => _.mergeWith({}, ...g, (o, s, k) => {
        if(k !== 'favorite') return // non favorite key are not collected to an array
        
        if(_.isNil(s)) return o // don't add null or undefined to array
        
        return [].concat(o || [], s) // concat other values to array
      }))
      .value()
      
    console.log(result)
    
    

  • 답변 # 3

    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script> 사용  그리고 map  이 결과를 얻으려면.

    먼저 새로운 고유 Set 를 만듭니다.   Set 를 사용하여  필드.

    우리는 새로운 id 를 뿌린다  이것에서 array 를 호출  방법.

    map
    
    

  • 답변 # 4

    어레이에서 축소를 사용할 수 있습니다.

    const arr = [ 
     { 
       id: 'Tony',
       type: 'hero',
       favorite: 'Rosie',
     },
     { 
       id: 'Jane',
       type: 'human',
       favorite: null,
     },
     { 
       id: 'Tony',
       type: 'hero',
       favorite: 'Lisa',
     },
     { 
       id: 'Steve',
       type: 'hero',
       favorite: 'Jennie',
     },
     { 
       id: 'Tony',
       type: 'hero',
       favorite: 'Jisoo',
     },
    ];
    const masterArr = [...new Set(arr.map((e) => e.id))].map(a => ({
      id: a,
      type: arr.find(x => x.id === a).type,
      favorites: arr.filter(x => x.id === a).map(y => y.favorite)
    }));
    console.log(masterArr);
    
    

  • 답변 # 5

    const arr = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ] const out = arr.reduce((result, el)=> { const id = result.findIndex(e => e.id ===el.id) if(id> -1){ result[id] = {...result[id], favorite: [...result[id].favorite, el.favorite]} } else {result.push({...el, favorite: [el.favorite].filter(x => x) })} return result }, []) console.log(out) 를 변환 한 후 배열을 반복하고 새 배열을 구성하십시오.  속성을 배열로 보낸 다음 동일한 ID를 가진 다음 요소의 경우 favorite 로 푸시하십시오.  배열

    favorite
    
    

    let users = [{id: 'Tony', type: 'hero', favorite: 'Rosie',}, {id: 'Jane', type: 'human', favorite: null,}, {id: 'Tony', type: 'hero', favorite: 'Lisa',}, {id: 'Steve', type: 'hero', favorite: 'Jennie',}, {id: 'Tony', type: 'hero', favorite: 'Jisoo',},]; // To combine friends of the same user in an array at property friendNames let merged = {}; for (let user of users) { if (typeof merged[user.id] === 'undefined') { user.favorite = [user.favorite]; merged[user.id] = user; } else { merged[user.id].favorite.push(user.favorite) } } console.log(Object.values(merged));

  • 이전 배치 스크립트를 사용하여 파일 이름에서 하위 문자열을 어떻게 가져올 수 있습니까?
  • 다음 excel - 통화 및 금액 찾기, 배열의 ID 저장소 및 출력 시트에 붙여 넣기