Асобнае значэнне з масіва яваскрипта аб'екта

У мяне ёсць гэты від аб'екта

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

Цяпер я хачу, каб прапусціць паўтараюцца запісу. Можа хто-небудзь прапанаваць мне шлях?

3
Калі ласка, праверце гэтую спасылка .
дададзена аўтар Mr_Green, крыніца
дададзена аўтар Samson, крыніца
@djtechie правы, цяпер вам патрэбен спосаб, каб параўнаць аб'екты. Object.toJSON (аб'ект) дапаможа.
дададзена аўтар Samson, крыніца
@Samson Дзякуй за review..but ІТС для масіва. Я маю масіў аб'ектаў
дададзена аўтар user2031602, крыніца

6 адказы

Агульны раствор для фільтрацыі аб'ектаў з некалькімі ўласцівасцямі.

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

EDIT:

Гэта не будзе магчыма параўноўваць першае або другое ўласцівасць, як ўласцівасці аб'екта не ў парадку, у JavaScript. Што мы можам зрабіць, гэта параўнаць з дапамогай ўласцівасці.

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

9
дададзена
убачыць абноўлены адказ
дададзена аўтар Diode, крыніца
@sweetamylase: Дзякуй за ўказанне на гэта.
дададзена аўтар Diode, крыніца
@djtechie калі вы хочаце тут функцыя фільтра можа быць заменена на цыкл, у выніку ўкладзенага цыклу. Ключы аб'ектаў не індэксуюцца ў JavaScript. Па ECMA стандартныя клавішы павінны быць праіндэксаваныя ў парадку іх дадання да аб'екта. Але мы не можам спадзявацца на гэта, бо ўсе браўзэры не падтрымліваюць такія паводзіны.
дададзена аўтар Diode, крыніца
Тнх шмат дапамог
дададзена аўтар Sergei Zahharenko, крыніца
@djtechie Ці мець на ўвазе, у Array.filter() метад даступны толькі ў ECMAScript 5. толькі браўзэры вы павінны турбавацца пра не выкарыстанні гэтай функцыі з'яўляецца IE 8 і ніжэй.
дададзена аўтар sweetamylase, крыніца
Дзякуючы tracevipin..it сапраўды дапамагло :). Але ці ёсць спосаб, калі я хачу, каб прайсці праз канкрэтную вобласць. Як, калі аб'ект мае два ключы, і я хачу, каб адпавядаць толькі другі ключавое значэнне для кожнага аб'екта?
дададзена аўтар user2031602, крыніца
Мы можам выкарыстоўваць IndexOf для масіва, тое, што для аб'екта?
дададзена аўтар user2031602, крыніца

Паспрабуйце таксама:

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);

<�Моцны> Працоўная скрыпку

0
дададзена

Праверце Linq для JavaScript (<�моцны> linq.js ), свабодная бібліятэка JavaScript даступная на CodePlex:

https://linqjs.codeplex.com/

Вы можаце апрабаваць фрагменты кода жыць на даведачнай старонцы (уваходзіць у камплект LINQPad, распакаваць яго першым - затым ўставіць фрагмент кода ў поле кода і вынік паказаны адразу):

<�Р> LinqJS \ linq.js_ver2.2.0.2 \ reference.htm

Як C# LINQ ён мае <�моцны> .distinct </моцны> метад, які дазваляе зрабіць працу для JSON масіва ў якасці однострочника, напрыклад:

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

Яна мае большасць метадаў, якія вы ведаеце з C# LINQ і пастаўляецца альбо як ня jQuery або як версія jQuery з поўнай падтрымкай NuGet.

Масівы з найменных ўласцівасцямі, як той, які вы маеце на вашым прыкладзе падтрымліваюцца таксама, напрыклад.:

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

0
дададзена

вы маглі б зрабіць нешта накшталт:

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

j.map(function(obj, index) {
    for(var key in obj ) {
        console.log( key );
        if( $.inArray(key, keyarr) < 0 ) {
            var newobj = {};
            newobj[key] = obj[key];
            unique.push(newobj)
        }
    }
});
console.log( unique );

Demo jsfiddle

0
дададзена

1) Зрабіце пятлю праз масіў.
2) На працягу гэтага цыклу, цыкл праз аб'ект
3) Захавайце ключ у глабальнай зменнай
4) Калі ключ ўжо існуе, выдаліць аб'ект з масіва.

Але ТБЙ, што сэнс стварэння масіва аб'ектаў, замест аднаго вялікага аб'екта? Затым усё дубляваныя ключы будуць аўтаматычна адменены ...

як

{
  "one" : 1,
  "two" : 2
  ...
}
0
дададзена
Я атрымліваю гэты масіў з API, і я не магу змяніць фармат вываду :), вось чаму. Ці будзеце вы даць мне прыклад кода вашага тлумачэння?
дададзена аўтар user2031602, крыніца

Вы можаце выкарыстоўваць «карту» ака аб'екта для адсочвання розных аб'ектаў. Мяркуючы, што унікальнасць вызначаецца як ключа і значэнне быўшы тым жа самым.

var data = [{'one':1},{'two':2},{'three':3},{'four':4},{'five':5},{'one':1}];
var tempMap = {};   //keep track of unique objects with key mapping to the object's key&value
var distinct = [];   //resulting list containing only unique objects
var obj = null;
for (var i = 0; i < data.length; i++) {
    obj = data[i];
    for (var key in obj) {       //look in the object eg. {'one':1}
        if (obj.hasOwnProperty(key)) {
            if (!tempMap.hasOwnProperty(key + obj[key])) {   //not in map
                tempMap[key + obj[key]] = obj;       //then add it to map
                distinct.push(obj);   //add it to our list of distinct objects
            }
            break;
        }
    }
}
console.log(distinct);  //list of distinct objects

See fiddle: http://jsfiddle.net/amyamy86/saSqt/

0
дададзена