2017-03-03 7 views
0

毎日入ってくる新聞記事のリストがあります。多くの新聞は大きなチェーンの一部であるため、同じ記事のすべてのバージョンを見たいとは思っていませんが、他のいくつの店舗で運ばれたかを見たいと思っています。配列から重複を削除しますが、残りの行に注釈を付けます

So..thisですが、私が見たいと思ってほしい

条1 ソース - ナショナルポスト

条2 ソースシアトルブレイズ、ニューヨークタイムズでも、- ワシントンポスト

私はこのコードを使ってこの作業を成功させていましたが、それは厄介なようでした。

サンプル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

私は私の元の質問によってあなたを幾分欺いたことを恐れる。この行が決してヒットしないので、更新された質問がより意味をなさないかどうかを確認してください(articles [title] .publication.name + = '、' + a.publication.name;) –

関連する問題