3

私はこの種のオブジェクトを持っています

var j = [{'one':1},{'two':2},{'three':3},{'four':4},{'five':5},{'one':1}];

ここで、重複レコードをスキップしたいと思います。誰かが私に道を提案できますか?

4

6 に答える 6

9

複数のプロパティを持つオブジェクトを除外するための一般的なソリューション。

var list = [{'one':1},{'two':2},{'four':4},{'one':1},{'four':4},{'three':3},{'four':4},{'one':1},{'five':5},{'one':1}];


Array.prototype.uniqueObjects = function(){
    function compare(a, b){
        for(var prop in a){
            if(a[prop] != b[prop]){
                return false;
            }
        }
        return true;
    }
    return this.filter(function(item, index, list){
        for(var i=0; i<index;i++){
            if(compare(item,list[i])){
                return false;
            }
        }
        return true;
    });
}

var unique = list.uniqueObjects();

編集:

オブジェクトのプロパティが JavaScript で順序付けられていないため、最初または 2 番目のプロパティを比較することはできません。私たちができることは、プロパティを使用して比較することです。

Array.prototype.uniqueObjects = function (props) {
    function compare(a, b) {
      var prop;
        if (props) {
            for (var j = 0; j < props.length; j++) {
              prop = props[j];
                if (a[prop] != b[prop]) {
                    return false;
                }
            }
        } else {
            for (prop in a) {
                if (a[prop] != b[prop]) {
                    return false;
                }
            }

        }
        return true;
    }
    return this.filter(function (item, index, list) {
        for (var i = 0; i < index; i++) {
            if (compare(item, list[i])) {
                return false;
            }
        }
        return true;
    });
};

var uniqueName = list.uniqueObjects(["name"]);
var uniqueAge = list.uniqueObjects(["age"]);
var uniqueObject = list.uniqueObjects(["name", "age"]);

http://jsbin.com/ahijex/4/edit

于 2013-05-30T07:47:38.033 に答える
0

CodePlex で入手できる無料の JavaScript ライブラリであるLinq for JavaScript ( linq.js ) を確認してください。

https://linqjs.codeplex.com/

リファレンス ページでコード スニペットをライブで試すことができます (linqpad パッケージに含まれています。最初に解凍し、コード スニペットをコード ボックスに貼り付けると、結果がすぐに表示されます)。

LinqJS\linq.js_ver2.2.0.2\reference.htm

C# LINQ と同様に、JSON 配列のジョブをワンライナーとして実行できる.distinctメソッドがあります。次に例を示します。

var array = [100, 200, 30, 40, 500, 40, 200];
var ex1 = Enumerable.From(array).Distinct().ToArray(); // [100, 200, 30, 40, 500]

C# LINQ でおなじみのほとんどのメソッドが含まれており、jQuery 以外のバージョンとして、または NUGET を完全にサポートする jQuery バージョンとして提供されます。

例にあるような名前付きプロパティを持つ配列もサポートされています。

var list = [
       { one: 2, two: 4, three: 1 },
       { one: 4, two: 7, three: 5 },
       { one: 2, two: 4, three: 1 },
       { one: 7, two: 3, three: 2 },
       ];
Enumerable.From(list).Distinct("$.one")
.OrderBy("$.a").ThenBy("$.two").ThenBy("$.three")
.Select("$.one + ':' + $.two + ':' + $.three")

結果は次のとおりです。

2:4:1
4:7:5
7:3:2

于 2015-11-25T12:37:35.573 に答える
0

1) 配列をループします。
2) そのループ内で、オブジェクトをループします。
3) キーをグローバル変数に保存します。
4) キーが既に存在する場合は、配列からオブジェクトを削除します。

しかし、1 つの大きなオブジェクトではなく、オブジェクトの配列を作成する意味は何ですか? その後、重複するキーは自動的に上書きされます...

お気に入り

{
  "one" : 1,
  "two" : 2
  ...
}
于 2013-05-30T07:35:44.903 に答える
0

これも試してください:

var j = [{'one':1},{'two':2},{'three':3},{'four':4},{'five':5},{'one':1}],
d = [],
key = [];
d = j.slice(0);
function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}
for(var i=0; i< d.length; i++){
    key.push(getKeys(d[i]));
}

for(var kI = 0; kI < key.length; kI++){
    for(var kJ = 0; kJ < key.length; kJ++){
        if(kI !== kJ && key[kI][0] === key[kJ][0]){
            key.splice(kJ,1);     
            d.splice(kJ,1);
        }
    }
}
console.log(j);
console.log(d);

働くフィドル

于 2013-05-30T08:54:53.740 に答える