2016-05-20 10 views
1

プロパティで配列の重複を削除します。私はオブジェクトのリストを持っているJavaScriptの

[{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}] 

私は、nameプロパティに関して重複を除外するする簡単な方法が必要になります。

[{name: "bob", age: "14"}, {name: "sue", age: "21"}] 

あるようですかなりの数の配列が重複削除質問であることは、プロパティに基づいていない。それは他のすべてのフィールドを無視することができます。

+4

除去される「ボブ重要ですか?それは常に最初の、または最年少でなければなりませんか? –

+0

問題なし、任意の順序 – user1212520

+5

可能な複製http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript –

答えて

0

forEachthisArg paramでこれを行うことができます。

var data = [{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}]; 
 
var result = []; 
 

 
data.forEach(function(e) { 
 
    if (!this[e.name]) { 
 
    this[e.name] = e; 
 
    result.push(this[e.name]); 
 
    } 
 
}, {}); 
 

 
console.log(result)

または、次のようにforEachmap()

var data = [{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}], result =[]; 
 

 
data.forEach(function(e) { 
 
    if(result.map(a => {return a.name}).indexOf(e.name) == -1) result.push(e); 
 
}); 
 

 
console.log(result)

0

であなたは、forループ2でそれを行うことができます。結果配列を保持し、その配列に挿入するたびに、名前属性が等しいかどうかをチェックするだけです。

function findDuplicate(){ 
    var array= [{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}]; 

    var result=[]; 
    for(x in array){ 
    var found=false; 
    for(y in result){ 
     if(result[y].name.localeCompare(array[x].name)==0){ 
     found=true; 
     } 
    } 
    if(!found){ 
     result.push(array[x]); 
    } 
    } 
    console.log(result); 
} 
1

反復配列、ハッシュ内のすべてのname値を配置し、そのnameハッシュにすでに存在するオブジェクトをスキップ:

filterBy = function(ary, prop) { 
 
    var seen = {}; 
 
    return ary.filter(function(item) { 
 
    var key = item[prop]; 
 
    if(seen[key] === 1) 
 
     return false; 
 
    seen[key] = 1; 
 
    return true; 
 
    }); 
 
} 
 

 
// 
 
a = [{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}] 
 

 
b = filterBy(a, 'name'); 
 

 
console.log(b);

ES6バージョン:

filterBy = function(ary, prop) { 
 
    var seen = new Set(); 
 
    return ary.filter(item => !seen.has(item[prop]) && seen.add(item[prop])); 
 
} 
 

 
a = [{name: "bob", age: "14"}, {name: "bob", age: "16"}, {name: "sue", age: "21"}] 
 

 
b = filterBy(a, 'name'); 
 

 
console.log(b);

0

同じ名前がすでにフィルタリングされる場合は、マーキングのためにArray#filterthisオブジェクトを使用することができます。 Q.での直接的な比較のために

var array = [{ name: "bob", age: "14" }, { name: "bob", age: "16" }, { name: "sue", age: "21" }], 
 
    filtered = array.filter(function (a) { 
 
     if (!this[a.name]) { 
 
      this[a.name] = true; 
 
      return true; 
 
     } 
 
    }, Object.create(null)); 
 

 
console.log(filtered);

0

、いくつかの 良い答えがここにあります。あなたがカスタム比較を提供したい場合は、例えば で動作します。オブジェクト値、または RegExpを使用している場合は、以下を見てください。

var dedupwhen = function(fn, list){ 
 
    if(list[0] === undefined){ 
 
     return []; 
 
    } 
 
    // Join the first item to the remainder that has had the first 
 
    // item filtered out (according to fn) and then been 
 
    // deduplicated itself. 
 
    return [list[0]].concat(dedupwhen(fn, list.slice(1).filter(function(item){ 
 
     return !fn(list[0], item); 
 
    }))); 
 
}; 
 

 
var similarname = function(x,y){ 
 
    return RegExp('^' + x.name + '$', 'i').test(y.name); 
 
}; 
 

 
var list = [ 
 
    {name: 'Sue', age: 44}, 
 
    {name: 'Bob', age: "14"}, 
 
    {name: 'bob', age: "16"}, 
 
    {name: 'sue', age: "21"} 
 
]; 
 
console.log(dedupwhen(similarname, list));

関連する問題