假设我有两个数组 - 一个是顺序的首选项,另一个是数据集,我想从匹配第一个匹配首选项的数据集中返回第一个元素。
例如
const userPref = ['banana', 'apple', 'peach'];
const givenFruits = [
{ name: 'apple', color: 'red' },
{ name: 'orange', color: 'orange' },
{ name: 'pear', color: 'yellow' },
{ name: 'cherry', color: 'red' },
{ name: 'grape', color: 'red' },
{ name: 'peach', color: 'red' },
{ name: 'coconut', color: 'brown' }
];
function findFavFruit() {
userPref.forEach((pref) => {
givenFruits.forEach((fruit) => {
if(pref === fruit.name) {
return fruit;
}
});
});
}
console.log('findFavFruit(): ' + JSON.stringify(findFavFruit(), null, 2));
这总是返回undefined
。它应该仅返回apple
,因为它是用户首先匹配的首选项,并且首先在givenFruits中找到。
我在上面的代码中做错了什么?在Javascript中有更清晰的方法(避免双forEach
)吗?
答案 0 :(得分:1)
您可以使用for...of遍历给定的水果并使用Array.includes来测试当前的水果是否在最喜欢的水果阵列中。
示例:
function findFavoriteFruit(preferences, arrayOfFruits) {
for (let fruit of arrayOfFruits) {
if (preferences.includes(fruit.name)) {
return fruit;
}
}
}
const userPref = ['apple', 'banana', 'peach'];
const givenFruits = [
{ name: 'apple', color: 'red' },
{ name: 'orange', color: 'orange' },
{ name: 'banana', color: 'yellow' },
{ name: 'pear', color: 'yellow' },
{ name: 'cherry', color: 'red' },
{ name: 'grape', color: 'red' },
{ name: 'peach', color: 'red' },
{ name: 'coconut', color: 'brown' }
];
const favoriteFruit = findFavoriteFruit(userPref, givenFruits);
console.log(favoriteFruit);

这种实施最快(与其他答案相比),因为您可以看到here。
答案 1 :(得分:1)
选择userPref
数组的第一个元素,将fruit.name
与.find()
函数进行比较,返回结果。
要仅返回属性值,例如"name"
,您可以将该属性作为字符串传递给函数,并使用括号表示法来引用并返回属性
const userPref = ['apple', 'banana', 'peach'];
const [preference] = userPref;
const givenFruits = [
{ name: 'apple', color: 'red' },
{ name: 'orange', color: 'orange' },
{ name: 'banana', color: 'yellow' },
{ name: 'pear', color: 'yellow' },
{ name: 'cherry', color: 'red' },
{ name: 'grape', color: 'red' },
{ name: 'peach', color: 'red' },
{ name: 'coconut', color: 'brown' }
];
function findFavFruit(pref, prop, arr) {
return arr.find(fruit => pref === fruit[prop])[prop];
}
let res = findFavFruit(preference, "name", givenFruits);
console.log(res);
答案 2 :(得分:0)
当然,您应该提供一些检查是否存在给定密钥,但这是基本的:
(givenFruits.find((v)=>{return v.name == userPref[0]})).name
如果您只需要第一个密钥,就不知道为什么要迭代userPref
。
答案 3 :(得分:0)
以上所有解决方案都是正确的,我只想澄清您的代码存在的问题。见下文:
function findFavFruit() {
let userFruit;
userPref.forEach((pref) => {
givenFruits.forEach((fruit) => {
if(pref === fruit.name) {
userFruit = fruit;
}
});
});
return userFruit;
}
如果发现果实,则会返回果实,如果没有,则返回未定义果实。