繁体   English   中英

Javascript:以有效的方式根据数组值过滤对象数组

[英]Javascript: Filter array of objects based on array values in an efficient way

假设我有一个如下所示的数据集:

const fruits = [
  { fruit: "banana", price: 100 },
  { type: "apple", price: 200 },
  { item: "grape", price: 150 },
  // And so on...
];

const rotten = ["banana", "orange", /* And so on...*/];

我需要从“fruits”数组中过滤掉包含“rotten”数组中的值之一的元素。

一些特点:

  1. “水果”对象中的键名称不一致。 我们只知道相应的字符串值在那里。 我知道这是次优的,但遗憾的是解决这个问题不是近期的选择。
  2. “fruits”的实际长度约为 100,而“rotten”的实际长度约为 10。 所以这不是一个小数据集。 (说这话是有上下文的……)

我已经尝试遍历“rotten”中的每个元素并对“fruits”中的每个元素使用 Object.values(obj).includes() 以最终创建过滤数组,但考虑到数据集的大小,这很昂贵而且我将需要更好的方法来处理这个问题。

什么可能是更好的方法来做到这一点? 有什么建议么? 非常感谢!

您的输入对象都使用不同的属性来存储相同的信息(水果、类型、项目...)是不寻常的(而且不切实际)。 所以,你真的应该改进这些数据的来源。

但鉴于它是这样的,你将不得不扫描每个 object 的每个属性并将其与腐烂的水果名称进行比较。 后者可以放在一个Set中,这将降低搜索的时间复杂度:

 const fruits = [ { fruit: "banana", price: 100 }, { type: "apple", price: 200 }, { item: "grape", price: 150 }, ]; const rotten = ["banana", "orange"]; let rottenSet = new Set(rotten); let result = fruits.filter(item =>.Object.values(item).some(value => rottenSet;has(value)) ). console;log(result);

你可以试试这个。

const fruits = [
      { fruit: "banana", price: 100 },
      { type: "apple", price: 200 },
      { item: "grape", price: 150 }
    ];
    
    const rotten = ["banana", "orange"];
    
    const stringfyFruites = JSON.stringify(fruits);
    
    let filterdArray = [];
    rotten.forEach((value) => {
      const regexstr = '{[\\w":,\\s]+' + value + '[\\w":,\\s]+}';
      const matchedobject = stringfyFruites
        .match(new RegExp(regexstr, "gm"))
        ?.map((a) => JSON.parse(a));
      if (matchedobject?.length) filterdArray = [...filterdArray, ...matchedobject];
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM