пометка дубликатов в массиве - PullRequest
0 голосов
/ 02 декабря 2009

После запроса некоторых пользовательских изображений я получаю массив, подобный этому:

[
    { label: "portrait", owner: "Jon" },
    { label: "house", owner: "Jim" },
    { label: "portrait", owner: "Jim" },
    { label: "portrait", owner: "Jane" },
    { label: "cat", owner: "Jane" }
]

Мне нужно выделить элементы, чье label встречается в массиве несколько раз (здесь: «портрет»).

В идеале, должен быть один флаг (A) для предметов, у которых label встречается снова позже в массиве, и другой флаг (B) для финального вхождения (то есть портреты Джона и Джима) помечены A, а Джейн - B).

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 02 декабря 2009

Я бы предложил перебирать массив рисунков и добавлять помеченный элемент к каждому объекту, в зависимости от того, является ли он дублированным. Смотрите ниже пример. Это назначит что-либо с дубликатом с 'A' и последним дубликатом с 'B'. Все, что не является дубликатом, не помечается.

var picture_array = [
        {label: 'portrait', owner: "Jon"},
        {label: 'house', owner: "Jim"},
        {label: 'portrait', owner: "Jim"},
        {label: 'portrait', owner: "Jane"},
        {label: 'cat', owner: "Jane"}
    ],
    length = picture_array.length;

//Loop through picture_array

for(var i = 0; i < length; i++) {
    var picture = picture_array[i],
        label = picture.label;

    //If picture has already been flagged, go the the next picture
    if (picture.flagged) {
       continue;
    }

    //Loop through rest of the array to compare duplicate labels
    var picture_a = picture;
    for(var j = i + 1; j < length; j++) {
        var picture_b = picture_array[j];

        //If picture_a matches picture_b then flag both of them appropriately
        if (picture_a.label == picture_b.label) {
            picture_a.flagged = 'A';
            picture_b.flagged = 'B';
            picture_a = picture_b;
        }
    }
}
1 голос
/ 02 декабря 2009

Я не уверен, что вы пытаетесь сделать, но, возможно, вам просто нужно объединить данные?

var data = [
    { name: "portrait", owner: "Jon" },
    { name: "house", owner: "Jim" },
    { name: "portrait", owner: "Jim" },
    { name: "portrait", owner: "Jane" },
    { name: "cat", owner: "Jane" }
];

var byName = {};

for (var i = 0, l = data.length; i < l; ++i) {
    if (!byName[data[i].name]){
        byName[data[i].name] = [];
    }
    byName[data[i].name].push(data[i].owner);
}

// byName == {portrait: ["Jon", "Jim", "Jane"], house: ["Jim"], cat: ["Jane"]}

var byOwner = {};

for (var i = 0, l = data.length; i < l; ++i) {
    if (!byOwner[data[i].owner]) {
        byOwner[data[i].owner] = [];
    }
    byOwner[data[i].owner].push(data[i].name);
}

А может тебе больше нравится:

var data = [
    { name: "portrait", owner: "Jon" },
    { name: "house", owner: "Jim" },
    { name: "portrait", owner: "Jim" },
    { name: "portrait", owner: "Jane" },
    { name: "cat", owner: "Jane" }
];

var byName = [];

for (var i = 0, l = data.length; i < l; ++i) {
    var done = false;
    for (var j = 0, k = data.length; j < k; ++j) {
        if (byName[j] && byName[j].name == data[i].name) {
            byName[j].data.push(data[i].owner);
            done = true;
        }
    }
    if (!done) {
        byName.push({name: data[i].name, data: [data[i].owner]});
    }
}

/*
byName == [
    {name: "portrait", data: ["Jon", "Jim", "Jane"]},
    {name: "house", data: ["Jim"]},
    {name: "cat", data: ["Jane"]}
] */

Потому что отправка случайного кода - это весело, и вы это знаете!

...