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' 数组中的值之一的元素。
一些特点:
- 'fruits' 对象中的键名不一致。我们只知道相应的字符串值在那里。我知道这是次优的,但很遗憾,解决这个问题不是近期的选择。
- '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];
});
假设我有一个如下所示的数据集:
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' 数组中的值之一的元素。
一些特点:
- 'fruits' 对象中的键名不一致。我们只知道相应的字符串值在那里。我知道这是次优的,但很遗憾,解决这个问题不是近期的选择。
- '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];
});