JavaScript中的数组遍历,用于填充两个映射表

5

var numerList = [1, 3, 7, 2, 4, 16, 22, 23];
var evenNoLst = numerList.map(function(no) {
  return ((no % 2) === 0);
});
console.log(evenNoLst)

对我而言,上述代码正在创建一个偶数地图,现在我也想要奇数列表。我需要再遍历一次数字列表吗?还是有一种方法可以在单个数组遍历中使用两个映射。
我正在使用Javascript。

谢谢大家,我已经接受了我使用的答案。 - user987316
1
仅出于兴趣和性能练习,我已经计时了每个给定答案,有趣的是,被接受的答案比其他任何答案都慢10倍以上。在这里查看fiddle - DeclanMcD
1
你使用了map来引用数组(而不是字典)(只是因为你使用了那个函数吗?)。然后你创建数字列表的意图与你创建布尔列表的示例不相符。有很多混淆在进行中... - hkBst
@hkBst 我也同意。显然,回答这个问题的每个人都正确地假设这个问题是关于过滤偶数和奇数的,这意味着问题中的代码应该像Ramesh Rajendran的答案一样。 - JollyJoker
4个回答

20
这里有一个使用 reduce 的一次性分割方法:

var numberList = [1, 3, 7, 2, 4, 16, 22, 23];

var grouped = numberList.reduce(function (acc, x){  
  acc[x%2].push(x);
  return acc;
}, [[], []]);

console.log(grouped);

结果是一个包含两个数组的数组:第一个数组包含偶数,第二个数组包含奇数。


6
你可以使用逻辑非运算符并映射所有布尔值。

var numerList = [1, 3, 7, 2, 4, 16, 22, 23],
    evenNoLst = numerList.map(no => no % 2 === 0),
    oddNoLst = evenNoLst.map(b => !b);

console.log(evenNoLst);
console.log(oddNoLst);
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用单个循环方法

var numerList = [1, 3, 7, 2, 4, 16, 22, 23],
    oddNoLst = [],
    evenNoLst = [];

numerList.forEach(function (no) {
    var even = no % 2 === 0;
    evenNoLst.push(even);
    oddNoLst.push(!even);
});

console.log(evenNoLst);
console.log(oddNoLst);
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用 for ... of 循环

var numerList = [1, 3, 7, 2, 4, 16, 22, 23],
    oddNoLst = [],
    evenNoLst = [],
    no, even;

for (no of numerList) {
    even = no % 2 === 0;
    evenNoLst.push(even);
    oddNoLst.push(!even);
}

console.log(evenNoLst);
console.log(oddNoLst);
.as-console-wrapper { max-height: 100% !important; top: 0; }


我使用了单循环方法。 - user987316
10
“单循环”方法实现起来十分丑陋……使用map函数与副作用并不兼容。 - Bergi
@Bergi 同意,应该进行正常的迭代并在不将其放在“map”内部的情况下同时推送两个列表。 - Pierre Arlaud
谢谢,更好了 :-) (当然我仍然更喜欢 for ... of 而不是 forEach - Bergi
@Bergi,这是有原因的吗,还是只是迭代的一种喜欢的方法? - Nina Scholz
@NinaScholz 它使命令式代码看起来更加命令式。它允许使用控制流关键字,如 yieldawaitreturnbreakcontinue。而且它更加简短。 - Bergi

3
您可以使用 array.prototype.reduce 和一些 destructuring 来实现:

var numberList = [1, 3, 7, 2, 4, 16, 22, 23];
var { evenList, oddList } = numberList.reduce((m, o) => {
    o % 2 === 0 ? m.evenList.push(o) : m.oddList.push(o);
    return m;
}, { evenList: [], oddList: []});

console.log("evenList: ", evenList);
console.log("oddList: ", oddList);


2
使用lodash的groupBy是一种更通用的模式。

var _ = require('lodash');

var numerList = [1, 3, 7, 2, 4, 16, 22, 23];

var result = _.groupBy(numerList, function(ele) {
  return ele%2;
});

console.log(result); //=> { '0': [ 2, 4, 16, 22 ], '1': [ 1, 3, 7, 23 ] }

如果您需要将数组分组为超过2个组,例如3个组,请执行以下操作:

var _ = require('lodash');

var numerList = [1, 3, 7, 2, 4, 16, 22, 23];

var result = _.groupBy(numerList, function(ele) {
  return ele%3;
});

console.log(result); //=> { '0': [ 3 ], '1': [ 1, 7, 4, 16, 22 ], '2': [ 2, 23 ] }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接