为了账号安全,请及时绑定邮箱和手机立即绑定

从JSON数组中删除重复的对象

从JSON数组中删除重复的对象

慕桂英4014372 2019-10-09 17:35:41
我有一个看起来像这样的数组:var standardsList = [    {"Grade": "Math K", "Domain": "Counting & Cardinality"},    {"Grade": "Math K", "Domain": "Counting & Cardinality"},    {"Grade": "Math K", "Domain": "Counting & Cardinality"},    {"Grade": "Math K", "Domain": "Counting & Cardinality"},    {"Grade": "Math K", "Domain": "Geometry"},    {"Grade": "Math 1", "Domain": "Counting & Cardinality"},    {"Grade": "Math 1", "Domain": "Counting & Cardinality"},    {"Grade": "Math 1", "Domain": "Orders of Operation"},    {"Grade": "Math 2", "Domain": "Geometry"},    {"Grade": "Math 2", "Domain": "Geometry"}];而且我需要删除重复项,以便保留类似以下内容:var standardsList = [    {"Grade": "Math K", "Domain": "Counting & Cardinality"},    {"Grade": "Math K", "Domain": "Geometry"},    {"Grade": "Math 1", "Domain": "Counting & Cardinality"},    {"Grade": "Math 1", "Domain": "Orders of Operation"},    {"Grade": "Math 2", "Domain": "Geometry"}];我曾尝试安装underscore.js并使用._uniq,但这似乎仅key:value在对象中出现一对时才起作用。我似乎无法让它跨多个键工作。当我尝试类似的东西:var uniqueStandards = _.uniq(standardsList, function(item, key, Domain){    return item.Domain;});我只得到前三个唯一值(每个年级一个)。但是我需要所有年级和领域的唯一值。是否有一种简单的方法将两个键都馈给_.uniq函数?最终,我需要一个列表,其中每个唯一的等级作为标题,唯一的域作为列表项,以传递到HTML页面中。我可能会犯这个错误,因此,如果有一种更简单的方法来实现最终目标,则可以公开征求意见。提前致谢!编辑:得到一些好的回应,并想澄清我的最终目标是什么。我正在尝试以HTML形式创建一系列列表:<div>    <h3>Math K</h3>    <li>Counting & Cardinality</li>    <li>Geometry</li></div><div>    <h3>Math 1</h3>    <li>Counting & Cardinality</li>    <li>Orders of Operation</li></div><div>    <h3>Math 2</h3>    <li>Geometry</li></div>我最初的想法是创建一个数组并将其推入<div>页面中的元素中,$("#divid").append(array)
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

function arrUnique(arr) {

    var cleaned = [];

    arr.forEach(function(itm) {

        var unique = true;

        cleaned.forEach(function(itm2) {

            if (_.isEqual(itm, itm2)) unique = false;

        });

        if (unique)  cleaned.push(itm);

    });

    return cleaned;

}


var standardsList = arrUnique(standardsList);

这将返回


var standardsList = [

    {"Grade": "Math K", "Domain": "Counting & Cardinality"},

    {"Grade": "Math K", "Domain": "Geometry"},

    {"Grade": "Math 1", "Domain": "Counting & Cardinality"},

    {"Grade": "Math 1", "Domain": "Orders of Operation"},

    {"Grade": "Math 2", "Domain": "Geometry"}

];

您到底要哪个?


查看完整回答
反对 回复 2019-10-09
?
偶然的你

TA贡献1841条经验 获得超3个赞

恢复了一个老问题,但是我想在@adeneo的答案上发布一个迭代。这个答案是完全笼统的,但是对于这种用例,它可能会更有效(在我的机器上有数千个对象的数组中,速度很慢)。如果您知道需要比较的对象的特定属性,则直接比较它们:


var sl = standardsList;

var out = [];


for (var i = 0, l = sl.length; i < l; i++) {

    var unique = true;

    for (var j = 0, k = out.length; j < k; j++) {

        if ((sl[i].Grade === out[j].Grade) && (sl[i].Domain === out[j].Domain)) {

            unique = false;

        }

    }

    if (unique) {

        out.push(sl[i]);

    }

}


console.log(sl.length); // 10

console.log(out.length); // 5


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 796 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号