【问题标题】:flagging duplicates in an array标记数组中的重复项
【发布时间】:2010-12-22 09:08:59
【问题描述】:

在请求一些用户图片后,我得到了一个这样的数组:

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

我需要突出显示数组中 label 出现多次的项目(这里:“肖像”)。

理想情况下,label 在数组中稍后再次出现的项目有一个标志 (A),最后出现的项目有另一个标志 (B)(即 Jon 的和 Jim 的)肖像标记为 A,而 Jane 标记为 B)。

任何帮助将不胜感激!

【问题讨论】:

  • 乔恩只有一次出现...为什么他会被标记? Janes cat 是最后一次出现...不会被标记为 B 吗?
  • 抱歉,我刚刚意识到这里可能造成的混乱。相关标准是图片的name,而不是owner的名称。会更新的,谢谢。

标签: javascript algorithm duplicates


【解决方案1】:

我不确定您要做什么,但也许您只需要汇总数据?

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"]}
] */

因为发布随机代码很有趣而且你知道的!

【讨论】:

  • 谢谢 - 我最终得到了与此非常相似的东西;按名称索引 (results[image.name].push(owner))。然后我稍后将其展平,这是我添加所需标志的时候。
  • 很高兴知道它对你有用 :) 我提出这个是因为标记数组成员而不是重新排序它们看起来很奇怪。我很好奇,你能告诉我为什么需要标记它们吗?如果它当然不是超级机密算法:)
  • 它基本上归结为名称/标签是唯一标识符(考虑创建一个包含所有图像的 ZIP 文件,使用标签作为文件名) - 因此,如果您有多次出现,则需要突出显示此类冲突.
【解决方案2】:

我建议遍历图片数组并向每个对象添加一个标记的成员,具体取决于它是否重复。请参阅下面的示例。它将分配任何具有“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;
        }
    }
}

【讨论】:

  • 这与我最初的想法非常接近 - 但我选择了 Kaze 的解决方案(现在?)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2020-12-31
  • 1970-01-01
  • 2010-10-27
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多