根据某些给定的首选项过滤和返回数组中的元素

时间:2017-08-01 23:45:40

标签: javascript arrays

假设我有两个数组 - 一个是顺序的首选项,另一个是数据集,我想从匹配第一个匹配首选项的数据集中返回第一个元素。

例如

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)吗?

4 个答案:

答案 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;
}

如果发现果实,则会返回果实,如果没有,则返回未定义果实。