2017-03-03 3 views
0

나는 매일 오는 신문 기사 목록을 가지고 있습니다. 많은 신문이 더 큰 체인의 일부이기 때문에 동일한 기사의 모든 단일 버전을보고 싶지는 않습니다. 그러나 얼마나 많은 다른 매장을 가지고 있는지보고 싶습니다.배열에서 중복을 제거하고 나머지 행에 주석을 달아주십시오.

So..this입니다 내가보고 싶어 할

제 1 조 출처 - 국립 포스트

제 2 조 소스 시애틀 블레이즈, 뉴욕 타임즈 또한, - 워싱턴 포스트

나는이 코드를 사용하여 성공적으로이 작업을 수행했다. 그러나 clunky 같았다.

샘플 JSON

var data = { 
     "articles": [ 
        { 
         "id": "1", 
         "title": "xxxx'", 
         "body": "<p>Body goes here", 
         "publication": { 
          "id": 1, 
          "name": "National Post" 
         }, 
         "articleUrl": "http://www.foo.com/1" 
        }, 
        { 
         "id": "2", 
         "title": "yyyy'", 
         "body": "<p>Body goes here", 
         "publication": { 
          "id": 1, 
          "name": "Washington Post" 
         }, 
         "articleUrl": "http://www.foo.com/2" 
        }, 
        { 
         "id": "3", 
         "title": "xxxx'", 
         "body": "<p>Body goes here", 
         "publication": { 
          "id": 1, 
          "name": "Seattle Blaze" 
         }, 
         "articleUrl": "http://www.foo.com/3" 
        }, 
        { 
         "id": "4", 
         "title": "xxxx'", 
         "body": "<p>Body goes here", 
         "publication": { 
          "id": 1, 
          "name": "New York Times" 
         }, 
         "articleUrl": "http://www.foo.com/4" 
        } 
       ] 
      } 


js.utils.RemoveDups = function RemoveDups(json) { 

var articles = new Array(); 
for (var i = 0; i < json.length; i++) { 
    var seen = false; 
    for (var j = 0; j != articles.length; ++j) { 

     if (json[i] != null && articles[j] != null) { 
      if (articles[j].title == json[i].title) { 
       seen = true; 

       articles[j].publication.name = articles[j].publication.name + ", <a href='" + json[i].articleUrl + "' target='_blank'>" + json[i].publication.name + '</a>'; 
      } 
     } 
    } 
    if (!seen) articles.push(json[i]); 
} 
return articles; 
}; 
지금보다 소형이며이 코드 덤비는거야

가능성이 빠르지 만 내가

dataArr = data.map(function (item) { return item.title }); 

에서 전체 개체를 가지고 있지 않기 때문에 나는 내가 해요 현재 게시 이름을 반환하지 못할

//Clean the Data 
if (json != null) { 

    var data = json.articles, 
    dataArr = data.map(function (item) { return item.title }); 

    //Remove Duplicates 
    dataArr.some(function (item, index) { 
     var isDuplicate = dataArr.indexOf(item, index + 1) !== -1; 
     if (isDuplicate) { 
      data[index].publication.name = data[index].publication.name + ',' + item[index].publication.name //<- dont have full object 
      data = removeDuplicate(data, item); 
     } 
    }); 
function removeDuplicate(data, title) { 
    $.each(data, function (index) { 
    if (this.title == title) { 
     data.splice(index, 1); 
     return false; 
    } 
    }); 
return data; 
} 

제거 : 보너스 질문 ... 나는 기계가 계속 복사 및 제거 할 ... 이상적으로, 내가하는 버전을 유지하려는 것입니다 결정하기 위해 사용하는 어떤 매개 변수를 완전히 확실하지 않다 item 객체 (item.wordCount) wordCount가 highe입니다. st ...

답변

1

먼저 배열을 사용하지 마십시오. 키가 기사 제목 인 개체를 사용하십시오.

js.utils.RemoveDups = function RemoveDups(json) { 
    var articles = {}; 
    json.articles.forEach(function(a) { 
     if (a.title in articles) { 
      articles[a.title].publication.name += ', ' + a.publication.name; 
     } else { 
      articles[a.title] = a; 
     } 
    }); 
    return articles; 
} 

당신이 결과를해야 할 경우에 return articles;를 교체 배열로 다시 설정 :

return Object.keys(articles).map(function(title) { 
     return articles[title]; 
    }); 
+0

죄송합니다, 아마 난 그냥 늦은 밤이 있었다,하지만 정확히이 코드로 대체 무엇입니까? 나는 그걸 밟았지만 그것은 단지 대상이 아니라 대상을 돌려주는 것입니까? –

+0

전체 기능을 보여주기 위해 답변을 업데이트했습니다. 전체 기사가 아니라 제목을 반환하는 이유가 무엇인지 생각할 수 없습니다. – Barmar

+0

나는 내 원래의 질문으로 너를 다소 잘못 인도했다는 것을 두려워한다. 업데이트 된 질문이이 줄이 결코 부딪치지 않아 더 이해가되는지 확인하십시오. (기사 [제목] .publication.name + = ','+ a.publication.name;) –