【问题标题】:Remove the object when the array string match in object key javascript当对象键javascript中的数组字符串匹配时删除对象
【发布时间】:2019-12-05 19:38:55
【问题描述】:

我正在使用其他代码,试图不破坏应用程序中的其他功能,但基本上我需要在条件匹配时删除对象。

我之前问的问题会删除对象,但不会在不同的代码库中,所以希望有人能给我一些想法。

感谢您的帮助!

const data = {   
   '123': {
        'name': 'Part 1',
        'size': '20',
        'qty' : '50'
    },
    '5678' : {
        'name': 'Part 2',
        'size': '15',
        'qty' : '60'
    },
   '9810' : {
        'name': 'Part 2',
        'size': '15',
        'qty' : '120'
    },
 }

// my code I tried work with:
const getValue = Object.keys(data).reduce((acc,id)=> {
   const condition = ['9810','5678'];
   if(acc[key]){
      // remove the object if the key match
      return !acc.includes(key[id])
   } else {
      // if not match just return the original object
      return acc
   }
},{})

【问题讨论】:

  • 输出应该是什么?
  • 另外,它是Object.keys 而不是Object.key

标签: javascript arrays object reduce


【解决方案1】:

如果你想创建一个删除了属性的新对象(这可能是个好主意),你应该将键处的值分配给累加器,你可以使用Object.entries来获取键和值立即在reduce 回调中。您还可以使用 Set 而不是数组来降低计算复杂度(Set.hasO(1),而 Array.includesO(n)):

const data = {
  '123': {
    'name': 'Part 1',
    'size': '20',
    'qty': '50'
  },
  '5678': {
    'name': 'Part 2',
    'size': '15',
    'qty': '60'
  },
  '9810': {
    'name': 'Part 2',
    'size': '15',
    'qty': '120'
  },
}

const condition = new Set(['9810', '5678']);
const filteredData = Object.entries(data).reduce((acc, [key, val]) => {
  if (!condition.has(key)) {
    acc[key] = val;
  }
  return acc;
}, {});
console.log(filteredData);

如果您想从现有 data 对象中实际删除子对象(改变您已有的data),然后使用forEach 进行迭代并使用delete删除属性:

const data = {
  '123': {
    'name': 'Part 1',
    'size': '20',
    'qty': '50'
  },
  '5678': {
    'name': 'Part 2',
    'size': '15',
    'qty': '60'
  },
  '9810': {
    'name': 'Part 2',
    'size': '15',
    'qty': '120'
  },
}

const condition = new Set(['9810', '5678']);
Object.keys(data).forEach((key) => {
  if (condition.has(key)) {
    delete data[key];
  }
});
console.log(data);

【讨论】:

  • 非常感谢您的快速回复。是否可以在 reduce 函数中创建 Key 条件?因为以前的开发人员使用该键从 reduce 函数中的其他条件生成一个数组。我搬不出来谢谢!
  • 在每次迭代时创建数组会导致大量不必要的开销,但如果您愿意,可以将其放入回调中。 (如果每次迭代都创建condition数组,不要使用Set,因为将数组转换为Set本身就是O(n)操作)
【解决方案2】:

要删除键数组中包含的子对象中的所有对象,请使用forEachdelete

const data = {'123':{'name':'Part 1','size':'20','qty':'50'},'5678' :{'name':'Part 2','size':'15','qty':'60'},'9810' :{'name':'Part 2','size':'15','qty':'120'}};

const condition = ["5678", "9810"];

condition.forEach(key => delete data[key]);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: auto; }

或者如果你想反过来 - 保留只包含在数组中的键:

const data = {'123':{'name':'Part 1','size':'20','qty':'50'},'5678' :{'name':'Part 2','size':'15','qty':'60'},'9810' :{'name':'Part 2','size':'15','qty':'120'}};

const condition = ["5678", "9810"];

Object.keys(data).forEach(key => !condition.includes(key) ? delete data[key] : key);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 非常感谢您的快速回复!让我试试这个!
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多