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. 'fruits' 对象中的键名不一致。我们只知道相应的字符串值在那里。我知道这是次优的,但很遗憾,解决这个问题不是近期的选择。
  2. 'fruits'的实际长度是~100,'rotten'的实际长度是~10。所以这不是一个小数据集。 (这句话是有上下文的……)

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

执行此操作的更好方法是什么?有什么建议么?非常感谢!

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

但鉴于它是这样的,你必须扫描每个对象的每个 属性 并将其与腐烂的水果名称进行比较。后者可以放在一个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];
    });