只需使用 FOR 循环: 如何将一个数组分成 2 个数组?[复制]

JUST USING THE FOR LOOP: how to divide an array into 2 arrays? [duplicate]

提问人:Alvaro Vasquez 提问时间:10/6/2023 最后编辑:Alvaro Vasquez 更新时间:10/16/2023 访问量:145

问:

我正在尝试将这个数组变成 2 个不同的数组。一个数组应包含包含字母“o”的名称,第二个数组应是其余不包含“o”的名称。

我只能使用 for 循环,唯一可以使用的方法是 .push()。

给定数组:

var names = ['octavia', 'peter', 'olive', 'ava', 'aiden']; 

期望结果:

var nameO = ['octavia', 'olive'];
var nameNoO = ['peter', 'ava', 'aiden'];

这是我想出的代码。得到了带有“o”的名称的结果之一,但不是没有“o”的名称。

var names = ['octavia', 'peter', 'olive', 'ava', 'aiden'];
var namesO = [];
var namesNoO = [];
for(let i in names){
  for(let j in names[i]){
    if(names[i][j] === 'o'){
      namesO.push(names[i]);
    } 
    if(names[i][j] !== 'o'){
    namesNoO.push(names[i])
    }
 }
}
console.log(namesO, namesNoO); 
JavaScript 数组 for 循环 if-statement

评论

2赞 John Wu 10/6/2023
问题是什么?
2赞 derpirscher 10/6/2023
if(names[i][j] !== 'o')将至少一个字符不同的所有名称推送到数组中。对于您的工作方法,您必须遍历完整名称,并且仅当未找到时,才将其添加到数组中onoOonoO
0赞 pilchard 10/6/2023
按过滤器函数划分数组或在元素上使用条件拆分数组如何在 javascript 中有条件地拆分数组

答:

-1赞 Damian Chudobiński 10/6/2023 #1

您可以使用数组函数来过滤项目。对于每个字符串,您可以使用它来检查它是否包含字母“o”。该函数在比较输入字符串之前将输入字符串转换为小写,确保这适用于大写字母和小写字母。.filter.includes.toLowerCase

var names = ['John', 'Alice', 'Bob', 'Carol', 'Oliver', 'Sophia'];

var namesWithO = names.filter(name => name.toLowerCase().includes('o'));
var namesWithoutO = names.filter(name => !name.toLowerCase().includes('o'));

var names = ['John', 'Alice', 'Bob', 'Carol', 'Oliver', 'Sophia'];

var namesWithO = [];
var namesWithoutO = [];

names.forEach(name =>
{
   if (name.toLowerCase().includes('o'))
   {
      namesWithO.push(name);
   }
   else
   {
      namesWithoutO.push(name);
   }
});

评论

1赞 maxpelic 10/6/2023
从字面上看,只是输入了这个答案
0赞 Ayoub k 10/6/2023
Includes将检查所有文本,而不仅仅是第一个字母。
1赞 Damian Chudobiński 10/6/2023
是的,正如问题所提到的,它还没有开始,所以这里包括是正确的
0赞 Alexander Nenashev 10/6/2023
它是 O(n*2),可以是 O(n)
0赞 derpirscher 10/7/2023
@AlexanderNenashev 严格来说,O(n) 和 O(2n) 之间没有绝对的区别
-1赞 AJ Michels 10/6/2023 #2

您应该花一些时间熟悉 Array 原型中的所有各种函数。

说你想“拆分”一个数组表明你正在寻找 Array.prototype.slice()。但是,您的示例表明您真正想要做的是过滤数组。为此,您需要使用 Array.prototype.filter() 函数。

const names = ['octavia', 'peter', 'olive', 'ava', 'aiden'];
const withNoO = name => !name.includes('o');
const withO = name => name.includes('o');

const nameO = names.filter(withO);
// ['octavia', 'olive'];

const nameNoO = names.filter(withNoO)
// ['peter', 'ava', 'aiden'];

我正在使用“箭头函数”来使代码更紧凑。这也可以像这样完成:

function withNoO(name) {
    return !name.includes('o');
}

function withO(name) {
    return name.includes('o');
}

const nameO = names.filter(withO);
// ['octavia', 'olive'];

const nameNoO = names.filter(withNoO)
// ['peter', 'ava', 'aiden'];
-3赞 Jordy 10/6/2023 #3

您可以使用 include 进行条件匹配。

   var names = ['octavia', 'peter', 'olive', 'ava', 'aiden'];
   var namesO = [];
   var namesNoO = [];

  for(var i=0, l = names.length; i < l; i++) {
     if(names[i].toLowerCase().includes("o")){
      namesO.push(names[i]);
      }
  if(!names[i].toLowerCase().includes("o")){
      namesNoO.push(names[i]);
    }
    }
     console.log(namesO,namesNoO);

评论

3赞 Alexander Nenashev 10/6/2023
最慢的到期和双倍.一个糟糕的选择toLowerCase()includes('o')