栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

最终,我需要一个列表,其中每个唯一的等级作为标题,唯一的域作为列表项,以传递到HTML页面中。我可能会犯错,因此,如果有更简单的方法来实现最终目标,则可以公开征求意见。

因此,您实际上并不需要您所要求的格式的输出数组。

在这种情况下,我将通过一个非常简单有效的解决方案直接进行追赶:

var grades = {};standardsList.forEach( function( item ) {    var grade = grades[item.Grade] = grades[item.Grade] || {};    grade[item.Domain] = true;});console.log( JSON.stringify( grades, null, 4 ) );

结果

grades
对象是:

{    "Math K": {        "Counting & Cardinality": true,        "Geometry": true    },    "Math 1": {        "Counting & Cardinality": true,        "Orders of Operation": true    },    "Math 2": {        "Geometry": true    }}

这种方法的有趣之处在于它非常快。请注意,它仅对输入数组进行一次遍历,这与其他需要多次遍历的解决方案不同(无论您是自己编写还是

_.uniq()
为您自己编写)。对于少量商品,这无关紧要,但是对于较大的商品,请记住这一点。

有了这个对象,您现在拥有了运行任何代码或生成所需任何其他格式所需的一切。例如,如果确实需要您提到的确切数组输出格式,则可以使用:

var outputList = [];for( var grade in grades ) {    for( var domain in grades[grade] ) {        outputList.push({ Grade: grade, Domain: domain });    }}JSON.stringify( outputList, null, 4 );

这将记录:

[    {        "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"    }]

Rai在评论中询问此代码行的工作方式:

var grade = grades[item.Grade] = grades[item.Grade] || {};

这是获取对象属性或缺少属性时提供默认值的常见用法。请注意,

=
分配是按从右到左的顺序进行的。因此,我们可以按字面意义将其翻译为使用一条
if
语句和一个temp变量:

// Fetch grades[item.Grade] and save it in tempvar temp = grades[item.Grade];if( ! temp ) {    // It was missing, so use an empty object as the default value    temp = {};}// Now save the result in grades[item.Grade] (in case it was missing)// and in gradegrades[item.Grade] = temp;var grade = temp;

您可能会注意到,在

grades[item.Grade]
已经存在的情况下,我们采用刚刚获取的值,并将其存储回相同的属性中。当然,这是不必要的,如果您像这样编写代码,则可能不会这样做。相反,您可以简化它:

var grade = grades[item.Grade];if( ! grade ) {    grade = grades[item.Grade] = {};}

那将是编写相同代码的完全合理的方法,并且效率也更高。与

||
成语所依赖的“真实性”相比,它还为您提供了一种更具体的测试方法。例如,
if( ! grade)
您可能想使用而不是
if( grade === undefined )



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号