删除数组中的元素

本文介绍了如何在JavaScript中删除数组中的特定元素,包括普通数组和关联数组的处理方法,并提供了一个实用函数来找出两个数组间的差异元素。

/***********删除数组元素******************/
//从数组删除
var start = 'false';
var L = 0;
for(var i = 0;i < add_exam.vars.choosed_user.length;i++) {
  if(add_exam.vars.choosed_user[i].pid == id) {
    if(start == 'false') {
      start = i;
    }
    //add_exam.vars.choosed_user.splice(i,1);
    L++;
  }
}
if(start != 'false') {
  add_exam.vars.choosed_user.splice(start,L);
}

//从关联数组删除
for(var a in add_exam.vars.uid_cid_arr) {
  if(add_exam.vars.uid_cid_arr[a].class_id == id) {
    delete add_exam.vars.uid_cid_arr[a];
  }
}

 

附:

A = [

  {'id':'3','name':'cjj'},

  {'id':'4','name':'hhh'}

]

B = [

  {'id':'3','name':'cjj'},

  {'id':'5','name':'kkh'}

]

//返回A数组中B没有的元素
 function get_buji(A,B){
  var a = {};
  var b = {};
  var result = [];
  for (var i in A) {
    if(A[i].hasOwnProperty("id")){
      a[A[i].id] = A[i];
    }
  }
  for (var i in B) {
    if(B[i].hasOwnProperty("id")){
      b[B[i].id] = B[i];
    }
  }
  var a_key = Object.keys(a);
  var b_key = Object.keys(b);

  for (var i in a_key) {
    if (b_key.indexOf(a_key[i]) == -1 && a[a_key[i]] != undefined) {
      result.push(a[a_key[i]]);
    }
  }
  return result;
}

转载于:https://www.cnblogs.com/bber/p/9666940.html

<think>我们正在讨论如何删除数组中的元素。在MATLAB中,删除数组元素通常有两种主要方法:逻辑索引和直接索引删除。根据引用[2]的内容,我们知道数组的插入和删除操作会导致元素的移动,因此效率是一个需要考虑的问题。 在MATLAB中删除数组元素的方法: 1. **使用逻辑索引**:创建一个逻辑数组,其中要保留的元素为true,要删除元素为false,然后重新赋值。 2. **直接索引删除**:通过指定要删除元素的位置索引,然后将这些位置设置为空(对于单元格数组或结构数组)或通过重新构造数组(对于普通数组)来删除。 注意:MATLAB中的数组在内存中是连续的,因此删除元素会导致后续元素移动,这可能对于大型数组效率较低。 具体操作: ### 1. 删除满足条件的元素(如删除所有零) 使用逻辑索引删除数组中所有为零的元素: ```matlab A = [1, 0, 3, 0, 5]; A = A(A ~= 0); % 保留非零元素 % 结果:A = [1, 3, 5] ``` 这里,`A ~= 0`生成一个逻辑数组`[1,0,1,0,1]`,然后使用它来索引原数组,只保留逻辑值为真的元素。 ### 2. 删除特定位置的元素 如果我们知道要删除元素的索引位置,可以使用以下方法: ```matlab indices = [2, 4]; % 要删除的位置(注意:如果删除多个元素,索引必须唯一且不重复,并且删除后索引会变化) A(indices) = []; % 删除指定位置的元素 ``` 例如: ```matlab A = [10, 20, 30, 40, 50]; A([2,4]) = []; % 删除第2个和第4个元素 % 结果:A = [10, 30, 50] ``` 注意:当使用索引删除多个元素时,索引必须是行向量或列向量,并且不能有重复。另外,删除多个元素时,索引应该从大到小删除,或者一次性删除,因为每删除一个元素数组长度就变小,后续元素的索引会改变。但是MATLAB允许一次性删除多个元素(如上所示),它会自动处理索引变化,即先标记所有要删除的位置,然后一次性删除。 ### 3. 删除重复元素(只保留唯一值) 虽然这不是直接删除指定元素,但有时我们想要删除重复元素。可以使用`unique`函数: ```matlab A = [1, 2, 3, 2, 4, 1]; A = unique(A); % 结果:A = [1,2,3,4] ``` ### 4. 删除NaN元素 删除缺失值(NaN)也是常见的操作: ```matlab A = [1, NaN, 3, 4, NaN]; A = A(~isnan(A)); % 删除NaN ``` ### 5. 删除元素(对于单元格数组) 对于单元格数组删除空单元格: ```matlab C = {'a', [], 'b', 'c', []}; C = C(~cellfun('isempty', C)); % 删除空单元格 ``` 注意事项: - 删除元素会改变数组大小,因此对于矩阵(二维数组),删除元素可能需要保持矩阵结构(例如,只能整行或整列删除)。对于向量(一维数组),则没有这个限制。 - 对于矩阵,如果要删除整行或整列,可以这样做: ```matlab M = [1,2,3; 4,5,6; 7,8,9]; M(2,:) = []; % 删除第二行 M(:,3) = []; % 删除第三列 ``` - 效率问题:当数组很大时,删除元素(特别是多个元素)可能会导致大量的数据移动。如果性能是关键,考虑使用其他数据结构(如链表)并不现实,因为MATLAB主要面向数组操作。在这种情况下,可以预先分配足够大的数组,然后使用逻辑索引来标记删除,而不是实际删除,直到最后必须删除时才进行。 引用[2]提醒我们:数组删除操作需要移动元素,因此频繁删除可能会导致效率问题。在MATLAB中,我们可以尽量使用逻辑索引来避免中间删除操作,或者将删除操作合并为一次进行。 示例:删除数组中所有小于0的元素 ```matlab A = randn(1, 100); % 100个随机数,可能有正有负 A = A(A>=0); % 删除所有负数 ``` 总结:在MATLAB中删除数组元素,最常用的是逻辑索引和直接索引删除。逻辑索引适用于删除满足条件的元素,而直接索引删除适用于已知要删除元素位置的情况。 §§相关问题§§ 1. 如何在MATLAB中高效删除大型数组中的多个不连续元素? 2. MATLAB中删除矩阵的整行或整列有哪些注意事项? 3. 如何在不移动元素的情况下“删除数组中的元素(例如使用掩码或标记法)? 4. MATLAB中对于不同数据类型的数组(如数值数组、字符数组、单元数组、结构体数组删除元素的方法有何异同? </think>### MATLAB 数组元素删除方法详解 在 MATLAB 中删除数组元素主要通过**逻辑索引**和**直接索引**两种方式实现,核心原理是创建一个新数组来排除要删除元素[^2]。以下是具体方法和示例: #### 1. **逻辑索引法(推荐)** ```matlab % 删除满足条件的元素(如删除所有0) A = [3, 0, 5, 0, 9]; A = A(A ~= 0); % 结果: [3, 5, 9] % 删除NaN值 B = [2.1, NaN, 4.7, NaN]; B = B(~isnan(B)); % 结果: [2.1, 4.7] ``` - **原理**:通过逻辑条件生成索引掩码,保留$true$位置元素 - **优势**:支持条件删除且不改变数组维度[^2] #### 2. **直接索引删除** ```matlab % 删除指定位置元素 C = [10, 20, 30, 40, 50]; positions = [2, 4]; % 要删除的位置 C(positions) = []; % 结果: [10, 30, 50] % 删除整行/整列(矩阵操作) D = [1,2,3; 4,5,6; 7,8,9]; D(2,:) = []; % 删除第2行 → [1,2,3; 7,8,9] D(:,3) = []; % 删除第3列 → [1,2; 7,8] ``` #### 3. **特殊数据类型处理** ```matlab % 单元格数组删除 cellArr = {'A', [], 'B', 'C'}; cellArr(cellfun('isempty', cellArr)) = []; % 删除空单元格 % 结构化数组删除 structArr(1).val = 10; structArr(2).val = 20; structArr(2) = []; % 删除第二个元素 ``` #### 4. **性能优化技巧** 1. **批量删除**:一次性删除多个元素比循环删除高效 ```matlab % 低效做法(循环删除) for i = length(A):-1:1 if A(i)==0, A(i)=[]; end end % 高效做法(逻辑索引) A(A==0) = []; ``` 2. **预分配内存**:大型数组操作前预分配目标数组大小 ```matlab newA = zeros(1, numel(A)-sum(A==0)); % 预分配 newA = A(A~=0); ``` #### 5. **删除重复元素** 结合`unique`函数实现去重: ```matlab E = [5, 2, 5, 8, 2]; E = unique(E); % 结果: [2, 5, 8](升序排列) ``` > **关键注意**: > - 删除元素会改变数组大小,可能导致维度错误 > - 矩阵操作时需保持矩形结构(不能删除单个元素导致锯齿状) > - 删除操作时间复杂度为$O(n)$,大型数组需谨慎[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值