精华内容
下载资源
问答
  • 在JavaScript项目实践中,我们可能会经常需要移除重复对象的例子,本文通过一个案例来详细解答,并给出了最优解,希望对你有所帮助。假设有下面这个数组对象,让你来删除重复项:const...

    在JavaScript项目实践中,我们可能会经常需要移除重复对象的例子,本文通过一个案例来详细解答,并给出了最优解,希望对你有所帮助。

    假设有下面这个数组对象,让你来删除重复项:

    const books = [
        {
            name: "My Sister the Serial Killer",  
            author: "Oyinkan Braithwaite" 
        },
        {
            name: "Educated",  
            author: "Tara Westover" 
        },
        {
            name: "My Sister the Serial Killer",  
            author: "Oyinkan Braithwaite" 
        }
    ];
    

    数组中的第一个对象和最后一个对象是相同的。那么,如果我们想从数组中删除这样的重复对象怎么办?令人惊讶的是,这是一个相当难解决的问题。为了了解原因,让我们来看看如何从一个数组中删除重复的对象,如字符串等平面项的数组中删除重复的对象。

    首先,我们先来看一个简单的数组去重。

    const strings = [
        "My Sister the Serial Killer", 
        "Educated", 
        "My Sister the Serial Killer"
    ];
    

    如果我们想从这个数组中删除任何重复的项目,我们可以使用filter()方法和indexOf()方法来检查任何给定的项目是否是重复的。

    const filteredStrings = strings.filter((item, index) => {
        // Return to new array if the index of the current item is the same
        // as the first occurence of the item
        return strings.indexOf(item) === index;
    });
    

    因为strings.indexOf(项)总是会返回该项的第一个出现的索引,所以我们可以判断当前在过滤循环中的项是否是重复的。如果是,我们就不返回到由filter()方法创建的新数组中。

    对象并不像上面这么简单

    这个相同的方法对对象不起作用的原因是,任何2个具有相同属性和值的对象实际上并不被认为是相同的。

    const a = {
        name: "My Sister the Serial Killer",  
        author: "Oyinkan Braithwaite" 
    };
    const b = {
        name: "My Sister the Serial Killer",  
        author: "Oyinkan Braithwaite" 
    };
    a === b // false
    

    这是因为比较对象是基于引用而不是结构来进行比较的。在比较对象时,不会考虑两个对象的属性和值是否相同的事实。因此,在一个对象数组中的indexOf(object)总是会返回所传递的对象的索引,即使存在另一个属性和值完全相同的对象。

    我的解决方案是

    鉴于这些信息,检查两个对象是否具有相同的属性和值的唯一方法就是实际检查每个对象的属性和值。我想出的解决方案是手动检查,但是为了提高性能和减少不必要的嵌套循环,我做了一些改动。

    特别是,我做了3件事情

    1.只检查数组中的每一个项目和后面的每一个项目,以避免对同一对象进行多次比较

    2.只检查未发现与其他物品重复的物品

    3.在检查每个属性的值是否相同之前,先检查两个对象是否有相同的键值

    下面是最后的解决方法

    function removeDuplicates(arr) {
        const result = [];
        const duplicatesIndices = [];
        // Loop through each item in the original array
        arr.forEach((current, index) => {
            if (duplicatesIndices.includes(index)) return;
            result.push(current);
            // Loop through each other item on array after the current one
            for (let comparisonIndex = index + 1; comparisonIndex < arr.length; comparisonIndex++) {
                const comparison = arr[comparisonIndex];
                const currentKeys = Object.keys(current);
                const comparisonKeys = Object.keys(comparison);
                // Check number of keys in objects
                if (currentKeys.length !== comparisonKeys.length) continue;
                // Check key names
                const currentKeysString = currentKeys.sort().join("").toLowerCase();
                const comparisonKeysString = comparisonKeys.sort().join("").toLowerCase();
                if (currentKeysString !== comparisonKeysString) continue;
                // Check values
                let valuesEqual = true;
                for (let i = 0; i < currentKeys.length; i++) {
                    const key = currentKeys[i];
                    if ( current[key] !== comparison[key] ) {
                        valuesEqual = false;
                        break;
                    }
                }
                if (valuesEqual) duplicatesIndices.push(comparisonIndex);
            } // end for loop
        }); // end arr.forEach()
        return result;
    }
    

    如果文章对你有帮助,点个在看,谢谢!

    好文和朋友一起看~

    展开全文
  • 数组-移除

    2019-10-11 11:45:10
    shift会从元素的开端移除一个对象(因此,剩余的对象像左移动 一个位置),pop会移除数组末端的一个元素。shift和pop都会返回它们移除数组的元素。 a=[1,2,3,4,5] print "the original array" p a popped=a.pop ...
    shift会从元素的开端移除一个对象(因此,剩余的对象像左移动 一个位置),pop会移除数组末端的一个元素。shift和pop都会返回它们移除数组的元素。
    a=[1,2,3,4,5]
    print "the original  array"
    p a
    popped=a.pop
    print "the popped item"
    p poped
     print "the new state of the array"
    p a
     shifted=a.shift
    print "the shifted item"   
    puts shifted
    print "the new state of the array"
    p a 
    输出结果
    the  original array :[1,2,3,4,5]
    

    the popped item:5
    the new state of the array:[1,2,3,4]
    the shifted item 1
    the new state of the array [2,3,4]

    展开全文
  • js实现数组元素移除

    千次阅读 2017-05-02 16:12:47
    首先可以给js的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为: Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == ...
    原文链接:http://caibaojian.com/js-splice-element.html

    首先可以给js的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为:

    Array.prototype.indexOf = function(val) {
    for (var i = 0; i < this.length; i++) {
    if (this[i] == val) return i;
    }
    return -1;
    };

    然后使用通过得到这个元素的索引,使用js数组自己固有的函数去删除这个元素:
    代码为:

    Array.prototype.remove = function(val) {
    var index = this.indexOf(val);
    if (index > -1) {
    this.splice(index, 1);
    }
    };

    这样就构造了这样一个函数,比如我有有一个数组:

    var emp = ['abs','dsf','sdf','fd']

    假如我们要删除其中的 'fd' ,就可以使用:

    emp.remove('fd');

    删除的数组的某一项

    splice(index,len,[item])    注释:该方法会改变原始数组。

    splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值·

    index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空

    如:arr = ['a','b','c','d']

    删除

    //删除起始下标为1,长度为1的一个值(len设置1,如果为0,则数组不变)
    var arr = ['a','b','c','d'];
    arr.splice(1,1);
    console.log(arr);  
    //['a','c','d']; 
    
    //删除起始下标为1,长度为2的一个值(len设置2)
    var arr2 = ['a','b','c','d']
    arr2.splice(1,2);
    console.log(arr2); 
    //['a','d']

    替换

    //替换起始下标为1,长度为1的一个值为‘ttt’,len设置的1
    var arr = ['a','b','c','d'];
    arr.splice(1,1,'ttt');
    console.log(arr);        
    //['a','ttt','c','d'] 
    
    var arr2 = ['a','b','c','d'];
    arr2.splice(1,2,'ttt');
    console.log(arr2);       
    //['a','ttt','d'] 替换起始下标为1,长度为2的两个值为‘ttt’,len设置的1

    添加 ----  len设置为0,item为添加的值

    var arr = ['a','b','c','d'];
    arr.splice(1,0,'ttt');
    console.log(arr);        
    //['a','ttt','b','c','d'] 表示在下标为1处添加一项'ttt'

    2:delete      

    delete删除掉数组中的元素后,会把该下标出的值置为undefined,数组的长度不会变

    //code from http://caibaojian.com/js-splice-element.html
    var arr = ['a','b','c','d'];
    delete arr[1];
    arr;  
    //["a", undefined × 1, "c", "d"] 中间出现两个逗号,数组长度不变,有一项为undefined

    更多相关推荐:

    1. javascript数组的方法
    2. javascript数组去重
    3. javascript常用代码大全

    更新2016-11-17:在stackoverflow高分回答上看到jquery之父John Resig曾经的文章写过的一个代码:

    // Array Remove - By John Resig (MIT Licensed)
    Array.prototype.remove = function(from, to) {
      var rest = this.slice((to || from) + 1 || this.length);
      this.length = from < 0 ? this.length + from : from;
      return this.push.apply(this, rest);
    };

    下面给出一些实际的用例:

    // 移除数组中的第二项
    array.remove(1);
    // 移除数组中的倒数第二项
    array.remove(-2);
    // 移除数组中的第二项和第三项(从第二项开始,删除2个元素)
    array.remove(1,2);
    // 移除数组中的最后一项和倒数第二项(数组中的最后两项)
    array.remove(-2,-1);

    这个例子跟上面第一个的还是挺相似的,不过没有检查元素的具体项目,而是通过元素在数组的下标位置来定位删除。



    展开全文
  • 构造对象数组 var template = data.template; var relatedTemps=[]; for(var i=0;i;i++){ var obj={}; obj.value=template[i].id; obj.label=template[i].name; relatedTemps.push(obj); } 移除数组中的指定位置...

    构造对象数组

    var template = data.template;
    var relatedTemps=[];
    for(var i=0;i<template.length;i++){
    	var obj={};
    	obj.value=template[i].id;
    	obj.label=template[i].name;
    	relatedTemps.push(obj);
    }
    

    移除数组中的指定位置的元素

    # 移除数组中的第0个元素(从第0个开始,删除1个)
    _self.metricTags.splice(0,1);
    

    清空数组

    _self.metricTags = [];
    

    判断数组中是否包含某个元素

    如果返回 -1,说明数组中不包含当前查找的元素

    var fruits = ["Banana", "Orange", "Apple", "Mango"];
    # 结果为2
    var index = fruits.indexOf("Apple");
    

    判断数组长度

    _self.srcRelResType.length 
    
    展开全文
  • vue+element获取el-table某行的下标,根据下标操作数组对象方式,下标,操作,文件,组件,按钮vue+element获取el-table某行的下标,根据下标操作数组对象方式易采站长站,站长之家为您整理了vue+element获取el-table某行的...
  • 编辑:我现在正在使用Arrays.asList而不是Collections.singleton*Singleton仅限于一个条目,而asList方法允许您在以后添加其他字符串以筛选出:Arrays.asList("a", "b", "c").Edit 2:上面的方法保留相同的数组(因此...
  • PSA: 从数组移除对象

    2017-11-16 23:33:00
    两次添加相同一个对象数组中 向数组发送removeObjectIdenticalTo: 消息, 传入你所添加的对象 数组的count是多少? 如果你说1, 你就错了(you’re wrong). 更糟的是,你可能会认为和addObject...
  • 非常常用的一段代码 ... 1 //数组移除指定对象或下标i 2 Array.prototype.remove = function (obj) { 3 for (var i = 0; i < this.length; i++) { 4 var temp = this[i]; 5 if (!isNaN(obj)) { 6 ...
  • 从一个数组移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素。 arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]]) 参数 arrayObj 必选项。一...
  • javascript数组对象实例方法有:pop(),push(),reverse(),shift(),sort(),splice(),unshift(),concat(),join(),slice() pop() : 移除数组中最后一个元素,并返回该元素。 如下: var a=[1,2,3] ; console.log(a....
  • 数组对象的删除有三种方法: pop(); //移除最后一个元素并返回该元素值shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,...
  • js 数组对象的操作方法 在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多。 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像JSON数据...
  • JS数组对象的方法

    2016-08-01 23:00:00
    concat 返回一个新数组,这个数组是由两个或更多数组组合而成的 array.concat(b,c);...pop 移除数组中的最后一个元素并返回该元素 array.pop(); push 将新元素添加到一个数组中,并返回数组的新...
  • 数组中删除空字符串可能是有意义的,但我也会将其保留为练习;目前,如果DeleteMe为null,它将在DeleteMe上调用等于时抛出NPE。)我在这里做的选择:我用的是LinkedList。迭代应该同样快,如果最终删除了很多元素,...
  • 数组对象方法

    2018-10-21 06:33:07
    数组末尾移除最后一项,减少length的值,并返回移除的项 shift() 删除数组的第一项,并返回删除元素的值,数组为空则返回undefined unshift() 在数组开头添加数据,并返回数组的长度 sort() 按升序排列数组项...
  • 根据id查找到对象数组里面的对象,然后移除对象 array 是定义的数组 var array = [{id:1,name:"b"},{id:2,name:"b"}]; for (var i = 0;i <array.length; i++){ if (ary[i].id==2){ ary.splice(i,1); ...
  •  数组.splice($.inArray(元素,数组),数量); 实例: var arr = ['a','b','c','d'];  arr.splice($.inArray('c',arr),1);   对象 var arr = [{a},{b},{c}]; for (var i = 0; i < arr.length; i++) arr.splice...
  • Object类型 *Array类型 *Date类型 *RegExp类型 *Function类型 基本包装类型:Boolean类型、Number类型和String类型 单体内置对象:Global对象、Math对象。首先创建一个数组 var aa = new Array...
  • 我调用两次方法也就是创建了两个marker对象,然后对他们进行移除,第一个对象的click里面还是有内容的,它也确实能响应这个事件,而第二个的click没有内容了。为什么会这样呢?我错在哪里? 希望大家不吝赐教!
  • 进行更改的方式不起作用,改变了data中的arr数组,但是未能正确渲染到页面中。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content=

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 942
精华内容 376
关键字:

数组对象移除