【问题标题】:How to remove specific column from data array (JS)如何从数据数组(JS)中删除特定列
【发布时间】:2026-02-10 12:15:01
【问题描述】:

我有一个清单

let list = [ 
{ 
  id: "247", 
  order_number: "21251", 
  tel: 13911111, 
  weight: "10kg" 
}, 
{ 
  id: "245", 
  order_number: "223", 
  tel: 31, 
  weight: "10kg" 
},
{ 
  id: "123", 
  order_number: "312312321", 
  tel: 3213123, 
  weight: "10kg" 
}
];

现在我只想删除特定列,例如“tel”,以获取新列表。有什么优雅的方法吗?还是我必须循环整个数据才能使用拼接方法?

【问题讨论】:

  • findIndex 后跟splice,这肯定够简单吧?
  • How to remove properties from an object array? 的可能重复项,尽管您应该选择投票最高的答案,而不是接受的答案,或者它下面的评论 — 在您的情况下:list.map(({id, order_number, weight}) => ({id, order_number, weight}))

标签: javascript arrays


【解决方案1】:

我会反对反对使用 delete 关键字,因为你会改变列表而不是创建一个新列表,还因为它的行为在 documentation 中进行了解释, 特别是那些关于:

  • 使用 let 或 const 声明的任何属性都不能从定义它们的范围中删除
  • 如果对象的原型链上存在同名的属性,那么在删除后,对象将使用原型链中的属性(也就是说,删除只对自己的属性有影响)。
  • 任何用 var 声明的属性都不能从全局作用域或函数作用域中删除。

您可以改为map()

listWithoutTel = list.map(({ tel, ...item }) => item);

在这里,您将使用 rest parameters 将所有属性 不需要的属性(在本例中为 teldestructured object 放入名为 item 的变量中并返回立即进入。

【讨论】:

  • 如果属性类似于 'tel num' ,如何处理? @克里斯托弗弗朗西斯科
  • 我见过的最佳答案。干杯!
  • 如何将“tel”设为变量?
【解决方案2】:

静态方式:

let list = [
  {
    id: "27",
    order_number: "21251",
    tel: 13911111,
    weight: "10kg"
  },
  {
    id: "245",
    order_number: "223",
    tel: 31,
    weight: "10kg"
  },
  {
    id: "123",
    order_number: "312312321",
    tel: 3213123,
    weight: "10kg"
  }
];
let new_list = list.map(function(obj) {
  return {
    id: obj.id,
    order_number: obj.order_number,
    weight: obj.weight
  }
});

console.log(list);
console.log(new_list)

这样,您可以同时保留旧数组和新数组。

如果您想以动态方式进行操作,您可以使用forEach 来检查密钥。

【讨论】:

    【解决方案3】:

    使用delete 运算符从循环中的所有对象中删除电话键

    let list = [ 
    { 
      id: "247", 
      order_number: "21251", 
      tel: 13911111, 
      weight: "10kg" 
    }, 
    { 
      id: "245", 
      order_number: "223", 
      tel: 31, 
      weight: "10kg" 
    },
    { 
      id: "123", 
      order_number: "312312321", 
      tel: 3213123, 
      weight: "10kg" 
    }
    ];
    var list2 = JSON.parse(JSON.stringify(list));
    for(i in list2) {
       delete list2[i].tel;
    }
    
    console.log(list2);
    console.log(list);

    【讨论】:

    • OP 指定了一个新列表。在删除tel之前,你必须先创建一个数组的浅拷贝
    • 更新了答案。请立即检查@MaxK
    【解决方案4】:

    据我所知,您不会找到不循环的方法。如果你考虑一下,为了从每个对象中删除键,无论如何它都需要循环它,即使它只是一个伪装成简单函数的循环。

    就简单性而言,我建议使用:

    list.forEach(function(x){delete x.tel});

    let list = [ 
    { 
      id: "247", 
      order_number: "21251", 
      tel: 13911111, 
      weight: "10kg" 
    }, 
    { 
      id: "245", 
      order_number: "223", 
      tel: 31, 
      weight: "10kg" 
    },
    { 
      id: "123", 
      order_number: "312312321", 
      tel: 3213123, 
      weight: "10kg" 
    }
    ];
    
    
    list.forEach(function(x){ delete x.tel });
    
    console.log(list);

    【讨论】:

    • 您可以在不循环的情况下执行此操作:Remove attribute for all objects in array。你甚至可以通过Proxy 的一些设置来做到这一点。
    • 如果我错了,请纠正我,但在这种情况下,由于每个对象都有键而不是少数几个,循环不会像另一种方法一样有效,因为在这两种情况下你都会去每个索引?
    • 如果你改变a single prototype,你就不会遍历每个索引。您还可以代理数组或对象并更改一些代理处理程序以使对象的行为就像它们没有 tel 属性一样。两种方法都是O(1) 而不是O(n)
    【解决方案5】:

    您可以使用删除关键字。

    delete myObject.prop
    

    【讨论】: