2016-11-25 22 views
0

私はいくつかのキーと値を持つjavascriptオブジェクトの配列を持っています。以下は私の配列の様子です。オブジェクトの配列から重複を削除する

[ 
{ 
"timestamp": 1474328370007, 
"message": "hello" 
}, 
{ 
"timestamp": 1474328302520, 
"message": "how are you" 
}, 
{ 
"timestamp": 1474328370007, 
"message": "hello" 
}, 
{ 
"timestamp": 1474328370007, 
"message": "hello" 
} 
] 

オブジェクト内のタイムスタンプの重複を削除し、そのオブジェクトが1回だけ発生するようにします。一致は、メッセージではなくタイムスタンプに基づいて行われます。

予想される出力は、配列が終了した後、私はdata[i+1]一部を把握することはできません

この

var fs = require('fs'); 

fs.readFile("file.json", 'utf8', function (err,data) { 
if (err) console.log(err);; 
console.log(data); 
// var result = []; 
for (i=0; i<data.length;i++) { 
    if(data[i].timestamp != data[i+1].timestamp) 
    console.log('yes'); 
    } 
}); 

ような何かをしようと

[ 
{ 
"timestamp": 1474328302520, 
"message": "how are you" 
}, 
{ 
"timestamp": 1474328370007, 
"message": "hello" 
} 
] 

です。私は上記の重複排除を行うことができる簡単な方法はありますか?

ありがとうございました

+0

http://underscorejs.org/#uniq –

答えて

4

オブジェクトをハッシュテーブルとして使用してチェックすることができます。

var array = [{ "timestamp": 1474328370007, "message": "hello" }, { "timestamp": 1474328302520, "message": "how are you" }, { "timestamp": 1474328370007, "message": "hello" }, { "timestamp": 1474328370007, "message": "hello" }], 
 
    result = array.filter(function (a) { 
 
     return !this[a.timestamp] && (this[a.timestamp] = true); 
 
    }, Object.create(null)); 
 

 
console.log(result);

あなたはあなたが使用することができます

var hash = Object.create(null), 
    result = []; 

for (i = 0; i < data.length; i++) { 
    if (!hash[data[i].timestamp]) { 
     hash[data[i].timestamp] = true; 
     result.push(data[i]); 
    } 
} 
+0

これは非常に賢いです! – sabithpocker

+0

@ニーナは返事をありがとう。このコードだけで動作します。しかし、私はファイルから配列を提供しています。そのようなアプローチのために変更を加える方法は? – csvb

+0

「data.filterは関数ではありません」というエラーが発生しました。私はここで何を逃したのですか? – csvb

0

ようにするユニークなアイテムに

チェックを削減し、取得し、ハッシュおよびフィルタリングされた結果のための1つの変数を使用することができますこのスニペット

var arr = [{ 
 
    "timestamp": 1474328370007, 
 
    "message": "hello" 
 
}, { 
 
    "timestamp": 1474328302520, 
 
    "message": "how are you" 
 
}, { 
 
    "timestamp": 1474328370007, 
 
    "message": "hello" 
 
}, { 
 
    "timestamp": 1474328370007, 
 
    "message": "hello" 
 
}]; 
 

 
var elements = arr.reduce(function(previous, current) { 
 

 
    var object = previous.filter(object => object.timestamp === current.timestamp); 
 
    if (object.length == 0) { 
 
    previous.push(current); 
 
    } 
 
    return previous; 
 
}, []); 
 

 
console.log(elements);

は、それがこれを行うには

+0

ありがとうございました。これは役に立ちます。このコードの仕組みについて説明できますか? 私はこの行が何をしているのか理解できません:reduceは一意の値を得るためにどのように使われますか? – csvb

+0

このラインは何をしていますか? ' 'return previous;}、[])' – csvb

+0

これは、既存のアイテムと現在のアイテムが存在するオブジェクトをフィルタリングしています。タイムスタンプは – Geeky

0

簡単な方法は、フラグの配列を使用することでお役に立てば幸いです。間違いなく良い方法がありますが、これはあなたのために働くはずの非常に簡単な方法です。

data = [ 
 
     { 
 
      "timestamp": 1474328370007, 
 
      "message": "hello" 
 
     }, 
 
     { 
 
      "timestamp": 1474328302520, 
 
      "message": "how are you" 
 
     }, 
 
     { 
 
      "timestamp": 1474328370007, 
 
      "message": "hello" 
 
     }, 
 
     { 
 
      "timestamp": 1474328370007, 
 
      "message": "hello" 
 
     } 
 
    ]; 
 

 
    // array to store result 
 
    result = []; 
 
    // store flags 
 
    flags = []; 
 

 
    for (i=0; i<data.length;i++) { 
 
     // dont run the rest of the loop if we already have this timestamp 
 
     if (flags[data[i].timestamp]) continue; 
 

 
     // if we didn't have the flag stored, then we need to record it in the result 
 
     result.push(data[i]); 
 

 
     // if we don't yet have the flag, then store it so we skip it next time 
 
     flags[data[i].timestamp] = true; 
 
    } 
 

 
    // stringify the result so that we can display it in an alert message 
 
    alert(JSON.stringify(result))

0

は、なぜあなたはfs.readFileとJSONファイルを読みますか?ただそれを要求する。

フィルタリングジョブ自体:

var arr = require('./file.json') 

var tester = [] 
var result = [] 

arr.forEach(function(el){ 
    if(tester.indexOf(el.timestamp) === -1) { 
    tester.push(el.timestamp) 
    result.push(el) 
    } 
}) 
関連する問題