当对象键javascript中的数组字符串匹配时删除对象

Posted

技术标签:

【中文标题】当对象键javascript中的数组字符串匹配时删除对象【英文标题】:Remove the object when the array string match in object key 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 【参考方案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; 

【讨论】:

非常感谢您的快速回复!让我试试这个!

以上是关于当对象键javascript中的数组字符串匹配时删除对象的主要内容,如果未能解决你的问题,请参考以下文章

通过数组键匹配对象 - Lodash

Javascript => 按日期相互匹配数组元素

如何在 JavaScript 中的对象数组中查找值?

如何在javascript对象中进行模式匹配

Javascript:从包含对象的多维数组中返回不匹配的值

检查Javascript中对象数组中的键是不是?