【问题标题】:unique javascript array based on one property基于一个属性的唯一 javascript 数组
【发布时间】:2014-04-30 19:34:18
【问题描述】:

我在 javascript 中有一个多维数组。我想让它显示每个唯一“名称”的第一条记录。比如这个:

[{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Aellen , Nick","col1":"Director","col2":"test","col3":"test","col4":"96.88%"},
{"name":"Armstrong , Peter","col1":"Director","col2":"test","col3":"test","col4":"95.15%"},
{"name":"Ashmore , Abigail","col1":"Vice President","col2":"test","col3":"test","col4":"99.80%"},
{"name":"Avent , Christopher","col1":"Vice President","col2":"test","col3":"test","col4":"90.11%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},

会变成这样:

[{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Aellen , Nick","col1":"Director","col2":"test","col3":"test","col4":"96.88%"},
{"name":"Armstrong , Peter","col1":"Director","col2":"test","col3":"test","col4":"95.15%"},
{"name":"Ashmore , Abigail","col1":"Vice President","col2":"test","col3":"test","col4":"99.80%"},
{"name":"Avent , Christopher","col1":"Vice President","col2":"test","col3":"test","col4":"90.11%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},

最初它不是多变量的,我可以使用基本函数,但该方法不适用于这个。有任何想法吗?好绝望!谢谢。

【问题讨论】:

  • 它实际上是一个对象数组而不是多维数组...
  • 对不起..我的错,整天都在走:p

标签: javascript jquery multidimensional-array unique


【解决方案1】:

这样的事情会创建一个仅包含第一个唯一记录的新数组

var obj     = {},
    new_arr = [];

arr.forEach(function(itm) {
    if ( ! (itm.name in obj) ) obj[itm.name] = itm;
});

for (var key in obj) {
    new_arr.push(obj[key]);
}

FIDDLE

【讨论】:

  • 你为什么不直接做new_arr.push(obj)?而不是for in 循环。
  • @RahilWazir - 因为我不是推送该对象,而是推送该对象中包含的对象等。只需使用名称作为键以确保它们是唯一的。
【解决方案2】:

这应该可以解决问题:

var foos = [{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Aellen , Nick","col1":"Director","col2":"test","col3":"test","col4":"96.88%"},
{"name":"Armstrong , Peter","col1":"Director","col2":"test","col3":"test","col4":"95.15%"},
{"name":"Ashmore , Abigail","col1":"Vice President","col2":"test","col3":"test","col4":"99.80%"},
{"name":"Avent , Christopher","col1":"Vice President","col2":"test","col3":"test","col4":"90.11%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"}];

var new_foos = [];

var previous_foo = null;

for (var i = 0; i < foos.length; i++) {
    if (previous_foo != foos[i].name)
    {
        new_foos.push(foos[i]);
    }

    previous_foo = foos[i].name;
}

正如 cmets 中提到的,这需要对 foo 进行排序。如果 foo 未排序,则此方法有效:

var foos = [{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},

{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},
{"name":"Ashmore , Abigail","col1":"Vice President","col2":"test","col3":"test","col4":"99.80%"},
{"name":"Baker , Ian Howard","col1":"Director","col2":"test","col3":"test","col4":"67.20%"},
{"name":"Aellen , Nick","col1":"Director","col2":"test","col3":"test","col4":"96.88%"},
{"name":"Armstrong , Peter","col1":"Director","col2":"test","col3":"test","col4":"95.15%"},{"name":"Adelman , Erica","col1":"Vice President","col2":"test","col3":"test","col4":"73.77%"},
{"name":"Avent , Christopher","col1":"Vice President","col2":"test","col3":"test","col4":"90.11%"}];

var new_foos = [];

for (var i = 0; i < foos.length; i++) {
    var new_foo = true;
    for (var j = 0; j < new_foos.length; j++) {
        if (foos[i].name == new_foos[j].name) {
            new_foo = false;
            break;
        }
    }

    if (new_foo)
    {
        new_foos.push(foos[i]);
    }
}

【讨论】:

  • 为什么解决方案是在 Python 中? :D
  • 显然这是一个漫长的日子 D:
  • @War10ck 我想是的,但我会说它仍然是可用的伪代码。我希望人们理解他们正在复制的代码,而不仅仅是复制粘贴,所以如果你有一定程度的理解,用 JS 重写应该不是很大的努力。
  • @Katana314 虽然这可能是真的,但如果您不熟悉python,我认为这并不完全清楚。我都写了,所以我明白你的意思。对于那些还没有的人,我认为这可能有点难以理解。不过,正是出于您所说的原因,我没有对帖子投反对票,而只是对其发表了评论。
  • 我会注意到,这个算法只有在数组按名称排序时才有效。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多