如何从数据数组中删除特定列(JS)

5

我有一个列表

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',以获得一个新的列表。有没有更好的方法来处理它?还是必须循环整个数据并使用splice方法?


findIndex接着splice,这难道不是很简单吗? - CertainPerformance
可能是如何从对象数组中删除属性?的重复问题,但您应该选择得票最高的答案,而不是被接受的答案或其下面的评论 - 在您的情况下:list.map(({id, order_number, weight}) => ({id, order_number, weight})) - Sebastian Simon
5个回答

12
我认为不应该使用delete关键字,因为这样会改变列表而不是创建一个新的,并且还因为其行为在文档中有所解释,特别是那些关于以下内容的行:
  • 任何使用let或const声明的属性都不能从定义它们的作用域中删除
  • 如果对象的原型链上存在同名属性,则删除后,对象将使用来自原型链的属性(换句话说,delete仅对自有属性有效)。
  • 任何使用var声明的属性都不能从全局作用域或函数作用域中删除。
相反,您可以使用map()
listWithoutTel = list.map(({ tel, ...item }) => item);

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

1
如果属性类似于“电话号码”,该如何处理?@Christopher Francisco - Ian
我看过的最好的答案。干杯! - Tim Harker
你如何将“tel”变成一个变量? - wingman
@Ian 我知道这是一个很旧的帖子,但你有解决你评论的方法吗? - Zubair Ahmd
@Ian使用该链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment中的答案帖子,可以通过空格传递字段名,例如listWithoutTel = list.map(({ 'tel num':telnum, ...item }) => item)。 - Zubair Ahmd

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检查键。

这个能否做成动态的?用户可以选择要删除哪些列(电话或电话和重量,...)? - NoBullMan

0

在循环中使用delete运算符从所有对象中删除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" 
}
];
var list2 = JSON.parse(JSON.stringify(list));
for(i in list2) {
   delete list2[i].tel;
}

console.log(list2);
console.log(list);


2
OP指定了一个新列表。在删除“tel”之前,您必须首先创建数组的浅拷贝。 - Max K
回答已更新,请现在检查 @MaxK - Nandita Sharma

0
据我所知,你不可能找到一种不需要循环的方法。如果你想删除每个对象中的键,无论如何都需要循环,即使它只是伪装成简单函数的循环。
就简单性而言,我建议使用: 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);


你可以不用循环来完成这个操作:删除数组中所有对象的属性。你甚至可以通过设置 Proxy 来实现。 - Sebastian Simon
请纠正我,但在这种情况下,由于每个对象都有键而不是仅有一些选择,循环是否与另一种方法一样有效,因为在两种情况下,您都将转到每个索引? - Andrew
如果您改变单个原型,就不必迭代每个索引。您还可以使用代理来更改数组或对象,并更改一些代理处理程序,使对象的行为好像它们没有tel属性。这两种方法都是O(1)而不是O(n) - Sebastian Simon

-2

你可以使用 delete 关键字。

delete myObject.prop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接