在对象中按 属性 而非值删除订单项

remove line items by property, not values, in an object

我有一个这样的对象:

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

我希望 obj 现在代表这个:

var obj = [
 {
        item1: 'test',
    item2: 'something',
 },
 {
        item1: 'test',
    item2: 'something',
 },
 {
        item1: 'test',
    item2: 'something',
 }
]

我找到了很多关于对象操作和使用键等的答案

JavaScript: filter() for Objects

这些答案的问题是

  1. 它是一种特定的对象格式,它们没有涵盖如何处理多个对象

  2. 它完全删除对象,而不是值和 keys/line 项

我最接近的是这个:

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var newObj = [];

obj.forEach(function(el){
    newObj.push(el.item1);
  newObj.push(el.item2);
})

console.log(newObj)

显然这还不够,因为我需要推送整个对象,而不仅仅是键值。

我正在尝试这样的事情 但这个答案不起作用,因为它是按值而不是按键进行的(?)

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var acceptedProps = ['item1', 'item2'];

var newObj = Object.keys(obj).reduce(function(r, e) {
  if (acceptedProps.includes(obj[e])) r[e] = obj[e]
  return r;
}, {})

console.log(newObj)

它只是给我一个空数组。我也试过翻转一些东西

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var acceptedProps = ['item1', 'item2'];

var newObj = Object.keys(obj).reduce(function(r, e) {
  if (acceptedProps.includes(obj[r])) r[e] = obj[r]
  return r;
}, {})

console.log(newObj)

请问re 在此函数中的含义是什么?

对于包含多个对象的数组,如何按 属性 而不是值过滤对象?

编辑 - 好的,我刚找到这个答案:

Remove array element based on object property

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var newObj = obj.filter(function( obj ) {
    return obj.field !== 'item3';
});

console.log(newObj)

所以现在...我必须以某种方式将其更改为 lop(?) 并更新每个没有行项目的对象...

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var obj = [
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 },
 {
        item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
 }
]

var newObj = obj.forEach(function(el) {
  el.filter(function( el ) {
    return el.field !== 'item3';
  });
})

console.log(newObj)

但我得到:

el.filter is not a function ...

我该怎么做?我做错了什么?

您可以使用 Array.map() 遍历数组项以创建新数组,Object.entries() 过滤掉作为数组项的对象的值,并使用 Object.fromEntries() 从过滤后的条目构建对象。

var obj = [{
    item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
  },
  {
    item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
  },
  {
    item1: 'test',
    item2: 'something',
    item3: 'REMOVE THIS',
    item4: 'REMOVE THIS',
    item5: 'REMOVE THIS',
  }
];

var newObj = obj.map(item => Object.fromEntries(
  Object.entries(item)
  .filter(([key, value]) => value !== 'REMOVE THIS')
));

console.log(newObj);

你可以尝试类似的东西

obj.map((item) => {
  return {
    item1: item.item1,
    item2: item.item2,
  }
});