Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在这种情况下,是否有更好的方法使用过滤器阵列?_Javascript_Arrays - Fatal编程技术网

Javascript 在这种情况下,是否有更好的方法使用过滤器阵列?

Javascript 在这种情况下,是否有更好的方法使用过滤器阵列?,javascript,arrays,Javascript,Arrays,我试图实现一个返回数组的函数 目标是过滤一个数组以获得黄色水果,但是如果有一个香蕉,则只返回所有香蕉而不是所有黄色水果 我的问题是,是否有其他方法来增强此功能,以避免过滤两次,而只进行一次过滤调用 这只是简单的Javascript。我可以使用JS的最新功能 let fruits = [ {name: 'Apple', color: 'Red', size: 'Small'}, {name: 'Banana', color: 'yellow', size: 'Medium'},

我试图实现一个返回数组的函数

目标是过滤一个数组以获得黄色水果,但是如果有一个香蕉,则只返回所有香蕉而不是所有黄色水果

我的问题是,是否有其他方法来增强此功能,以避免过滤两次,而只进行一次过滤调用

这只是简单的Javascript。我可以使用JS的最新功能

let fruits = [
    {name: 'Apple', color: 'Red', size: 'Small'},
    {name: 'Banana', color: 'yellow', size: 'Medium'},
    {name: 'Orange', color: 'orange', size: 'Big'},
    {name: 'Mango', color: 'yellow', size: 'Medium'},
    {name: 'Guava', color: 'yellow', size: 'Medium'},
];

function getFruitsThatAreYellowButReturnOnlyBananaIfExists(fruits)
{
    let yellowFruits = [];

    const bananaFruit = fruits.filter(fruit => fruit.name === "Banana")
        .map(banana => `I'm a banana ${banana.size}`);

    if (bananaFruit.length > 0) {
        return bananaFruit;
    }

    yellowFruits = fruits.filter(fruit => fruit.color === 'yellow')
        .map(yellowFruit => `I'm ${yellowFruit.name} my color is yellow , my size is ${yellowFruit.size}`);

    return yellowFruits;
}

const fruitsOrBanana = getFruitsThatAreYellowButReturnOnlyBananaIfExists(fruits);
如果
水果
数组中有一个
香蕉
,并且有一个这样的消息数组,我希望得到结果:

[ "I'm Mango my color is yellow , my size is Medium", "I'm Guava my color is yellow , my size is Medium" ]

如果
水果
数组中没有香蕉。

您可以用一种方法编写这篇文章,这种方法并不奇特,但以后可能很容易理解:

const bananas = [];
const yellowFruits = [];

//Only requires 1 loop.
fruit.forEach(f => {
  if (f.name === 'Banana') { 
    bananas.push(`I'm a banana ${f.size}`);
  }
  else if (f.color === 'yellow') { 
    yellowFruits.push(`I'm ${f.name} my color is yellow , my size is ${f.size}`); 
  }
});

if (bananas.length > 0) {
  return bananas;
}
else {
  return yellowFruits;
}


可以使用循环在对象数组上仅迭代一次。迭代时,可以在一个数组中收集
香蕉
,在另一个数组中收集黄色水果。然后,如果有香蕉,可以返回香蕉数组,否则返回黄色水果数组

let fruits=[{名称:'Apple',颜色:'Red',大小:'Small'},{名称:'Banana',颜色:'yellow',大小:'Medium'},{名称:'Orange',颜色:'Orange',大小:'Big'},{名称:'Mango',颜色:'yellow',大小:'Medium'},{名称:'Guava',颜色:'yellow',大小:'Medium'};
函数getfruits为黄色,但返回值仅为ananai不存在(fruits)
{
让黄色水果=[],香蕉=[];
用于(水果的常数{名称、颜色、大小})
{
if(name.toLowerCase()=“banana”)
香蕉。推(`I'm a banana${size}`);
else if(color.toLowerCase()=“黄色”)
推送(`I'm${name}我的颜色是黄色,我的尺寸是${size}`);
}
返回香蕉。长度?香蕉:黄色水果;
}
log(getfruitsthatareyellowbutreturnonlybanainefexists(fruits));
水果[1]。名称=“柠檬”;
log(getfruitsthatareyellowbutreturnonlybanainefexists(fruits))
.as控制台{背景色:黑色!重要;颜色:石灰;}

作为控制台包装{max height:100%!important;top:0;}
快速浏览,我个人一直主张使用一个
.reduce()
而不是
.filter()
+
.map()
来减少迭代次数。除此之外,我不太确定你在问什么——你的代码似乎输出了你想要的东西。通过“更好的方式”,你具体是什么意思?就运行时间而言,如果这是你要问的,你最好只使用常规的旧方法,一次循环并处理它——最好的情况是O(1)和最坏的情况是O(n),而不是在这种情况下总是O(n)。加上basic for循环比.map之类的函数要快。如果代码有效,除非您有非常具体的请求或请求,否则这不是stackoverflow的好问题concern@Kaiido为了达到这一点,我更新了,读了这篇文章后,我错失了目标:如果有香蕉,那么就把香蕉退回,而不是所有黄色的水果