英文:
Javascript find objects that contain matching elements from arrays in another object
问题
Here's the translated code:
我有两个对象:
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
}
我想要找出哪些'people'喜欢水果'apple'或'mango'以及蔬菜'asparagus',这些条件由'demographics'对象定义,如下所示:
[{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}]
希望这可以帮助你解决问题。如果有可能,我建议使用underscore,但这不是必需的。
英文:
I have two objects:
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
}
I would like to find which 'people' like the fruit 'apple' or 'mango' and the veg 'asparagus', as defined in the 'demographics' object, like so:
[{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}]
I've been staring at this all day and am not advanced enough to dig into objects like this. Can anyone help? If possible, I would like to use underscore, but not essential.
答案1
得分: 1
我已经翻译了您提供的代码注释部分:
// 首先,我将人口统计对象转换为数组,以便轻松迭代。之后,使用条件筛选人员数组,检查每个人口统计中至少有一个满足条件(位于每个人的蔬菜或水果数组中)。
// 如果您想使用underscore来转换上面的代码,您可以找到等效的方法 `pairs`,`filter`,`some`,`every`,`contains`。
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
}
const demographicsEntries = Object.entries(demographics)
const res = people.filter(person => demographicsEntries.every(([k,v]) => v.some(val => person[k].includes(val))))
console.log(res)
请注意,这段代码主要用于筛选符合指定条件的人员,以满足每个人口统计中至少有一个满足的条件。如果您有任何进一步的问题或需要其他帮助,请随时告诉我。
英文:
first I converted the demographics object to an array so i can iterate easily. after that filter the person array with the conditions
check every demographic where in each demographic at least 1 satisfies (is inside the veg or fruit.. arrays of a person).
You can find equivalent methods pairs
,filter
,some
,every
,contains
if you want to convert above using underscore
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
}
const demographicsEntries = Object.entries(demographics)
const res = people.filter(person => demographicsEntries.every(([k,v]) => v.some(val => person[k].includes(val))))
console.log(res)
<!-- end snippet -->
答案2
得分: 0
这里的人是一个对象数组。
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}
];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
};
people.filter(person =>
person.fruit.some(fruitName => demographics.fruit.includes(fruitName)) &&
person.veg.some(vegName => demographics.veg.includes(vegName)) &&
person
);
希望这有所帮助 (y)
英文:
people in here is an array of objects.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const people = [
{
name: "Dave",
fruit: ["apple", "pear"],
veg: ["asparagus", "peas"]
},
{
name: "Frank",
fruit: ["mango", "banana"],
veg: ["sweetcorn"]
},
{
name: "Alice",
fruit: ["mango", "peach"],
veg: ["asparagus"]
}];
const demographics = {
fruit: ["apple", "mango"],
veg: ["asparagus"]
};
people.filter(person =>
person.fruit.some(fruitName=> demographics.fruit.includes(fruitName)) && person.veg.some(vegName=> demographics.veg.includes(vegName)) && person);
<!-- end snippet -->
Hope this will help (y)
答案3
得分: 0
现代JavaScript提供了许多非常有用的数组和对象方法,您可以使用它们来减少Underscore的额外代码。以下是您提供的代码部分:
const data = [
{ name: 'Dave', fruit: ['apple', 'pear'], veg: ['asparagus', 'peas'] },
{ name: 'Frank', fruit: ['mango', 'banana'], veg: ['sweetcorn'] },
{ name: 'Alice', fruit: ['mango', 'peach'], veg: ['asparagus'] }
];
function find(data, query) {
return data.filter(person => {
return Object.keys(query).every(key => {
return query[key].some(el => {
return person[key].includes(el);
});
});
});
}
const query = { fruit: ['apple', 'mango'], veg: ['asparagus'] };
console.log(find(data, query));
const query2 = { fruit: ['apple'], veg: ['peas'] };
console.log(find(data, query2));
const query3 = { fruit: ['banana'], veg: ['peas'] };
console.log(find(data, query3));
您可以查看附加文档以了解有关filter
,every
,some
和includes
等方法的更多信息。
英文:
Modern JavaScript has a lot of really useful array and object methods that you can use to spare the additional code footprint of Underscore.
In essence (links to documentation below) you want to filter
out all of the people who have at least some
of the elements in their fruit/veg arrays that appear in every
corresponding query array.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const data=[{name:'Dave',fruit:['apple','pear'],veg:['asparagus','peas']},{name:'Frank',fruit:['mango','banana'],veg:['sweetcorn']},{name:'Alice',fruit:['mango','peach'],veg:['asparagus']}];
// Accepts some data, and the query object
function find(data, query) {
// `filter` out all the people...
return data.filter(person => {
// ...who, for every query key (fruit/vegetable),
// have at least one item in their fruit/veg array
// that includes an item in the corresponding query array
return Object.keys(query).every(key => {
return query[key].some(el => {
return person[key].includes(el);
});
});
});
}
const query={fruit:['apple','mango'],veg:['asparagus']};
console.log(find(data, query));
const query2={fruit:['apple'],veg:['peas']};
console.log(find(data, query2));
const query3={fruit:['banana'],veg:['peas']};
console.log(find(data, query3));
<!-- end snippet -->
Additional documentation
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论