如何在JavaScript中使用数组减少条件?

时间:2017-07-20 02:51:49

标签: javascript arrays vue.js computed-properties

所以我有一个数组

const records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
]

我想获得sum所以我使用了JavaScript数组reduce功能并且正确。这是我的代码:

someFunction() {
  return records.reduce(function(sum, record){
    return sum + record.value; 
  }, 0);
}

使用该代码,我得到的值173是正确的。现在我想要的是将所有金额仅用于那些"BOYS"性别的对象。

我试过像

这样的东西
someFunction() {
  return records.reduce(function(sum, record){
    if(record.gender == 'BOYS') return sum + record.value; 
  }, 0);
}

但我一无所获。我在这里错过了什么吗?任何帮助将不胜感激。

8 个答案:

答案 0 :(得分:17)

当你从reduce函数返回任何内容时,它返回undefined和undefined + 1 === NaN。您应该在减少之前过滤数组。

records.filter(({gender}) => gender === 'BOYS')
    .reduce((sum, record) => sum + record.value)

答案 1 :(得分:7)

如果条件不匹配,您需要返回当前金额,而不是unefined

否则,您不会将累加器返回到reduce函数,并在匹配时最终添加undefined + record.value,或者在匹配时添加undefined + <script> const records = [{ value: 24, gender: "BOYS" }, { value: 42, gender: "BOYS" }, { value: 85, gender: "GIRLS" }, { value: 12, gender: "GIRLS" }, { value: 10, gender: "BOYS" } ]; function someFunction() { return records.reduce(function(sum, record) { return (record.gender !== 'BOYS') ? sum : sum + record.value; }, 0); } console.log(someFunction()); </script>

试试这个:

&#13;
&#13;
def get_permissions(self):
    if self.request.method == 'GET':
        return [permissions.AllowAny()]
    elif self.request.method == 'DELETE':
        return [permissions.IsAdminUser()]
    else:  # PUT, PATCH
        return [...]
&#13;
&#13;
&#13;

答案 2 :(得分:6)

如果性别是&#39; GIRLS&#39;它将返回undefined。添加一个返回sum的else语句,它应该解决问题。

&#13;
&#13;
oracle_client_basic
&#13;
&#13;
&#13;

答案 3 :(得分:3)

当性别为sum时,您还应该返回GIRLSreduce会检查每个项目,并期望return值。如果您没有return值,则为undefined。因此,在第三次迭代之后,sum将为undefined

const sumBoys = records.reduce((sum, record) => {
  if (record.gender.toLowerCase() === 'boys') {
    return sum + record.value;
  }

  return sum;
}, 0);

const records = [{
  value: 24,
  gender: "BOYS"
}, {
  value: 42,
  gender: "BOYS"
}, {
  value: 85,
  gender: "GIRLS"
}, {
  value: 12,
  gender: "GIRLS"
}, {
  value: 10,
  gender: "BOYS"
}];

const sumBoys = records.reduce((sum, record) => {
  if (record.gender.toLowerCase() === 'boys') {
    return sum + record.value;
  }

  return sum;
}, 0);

console.log(sumBoys);

答案 4 :(得分:1)

您正在尝试检索哪个对象具有性别为“BOYS”。但是当时一些具有女性性别的物体将会返回未定义的物体。

尝试这样做以避免未定义....

            var resSet=records.filter(function(options){
                return options.gender == "BOYS";
            }).reduce(function(a,b){
                return a+parseInt(b.value);
            },0);

            console.log("the sum of boys set is --"+resSet);

答案 5 :(得分:0)

好吧,如果您只想坚持使用reduce而不想使用filter,则可以这样操作:

const records = [
    {
        value: 24,
        gender: "BOYS"
    },
    {
        value: 42,
        gender: "BOYS"
    },
    {
        value: 85,
        gender: "GIRLS"
    },
    {
        value: 12,
        gender: "GIRLS"
    },
    {
        value: 10,
        gender: "BOYS"
    }
];

  var res = records.reduce(function(sum, record){
    if(record.gender === 'BOYS') {
       return sum + record.value;
     } else{
        return sum
    }; 
  }, 0);
  console.log(res);

  var res = records.reduce(function(sum, record){
    if(record.gender == 'BOYS') {
       return sum + record.value;
     } else{
        return sum
    }; 
  }, 0);

答案 6 :(得分:0)

我们可以使用此简化代码

let res= records.reduce(function(a,b){ 
    return (b.gender === "BOYS" && (a+parseInt(b.value))) || a; 
}, 0);

答案 7 :(得分:0)

您遇到了错误,因为在每个元素i中都减少了iterate。方法。数组并返回.accumulated值,

发生的事情是,当您的条件不满足时,累加器的值将变为未定义,因为您没有返回它。

如果满足条件,则需要先加总。 在if范围之外返回总和,