Как разделить строки внутри массива в JavaScript (чтобы получить имена из полных имен)

#javascript #arrays #string #foreach #split

#javascript #массивы #строка #foreach #разделить

Вопрос:

Мое задание — напечатать имена всех пользователей из набора данных, которые соответствуют определенной категории; однако набор данных представляет собой массив объектов, который предоставляет полное имя в виде строки, например:

 var dataSet = [ 
    {
        "name": "John Doe",
        "age": 60,
        "math": 97,
        "english": 63,
        "yearsOfEducation": 4
    },
    {
        "name": "Jane Doe",
        "age": 55,
        "math": 72,
        "english": 96,
        "yearsOfEducation": 10
    }
]
  

Я не могу использовать какие-либо встроенные функции типа массива, кроме filter() , map() и reduce() .

Последний фрагмент моего кода (для получения имен из массива объектов «DataSet») выглядит следующим образом:

 var youngGoodMath = dataSet.filter(function(person){
    return person.age < avgAge amp;amp; person.math > avgMath;
  });

  var yGMname = youngGoodMath.map(function (person){
    return person.name;
  });

console.log(yGMname);
  

который создает массив строк, который выглядит примерно так:

 ["Jane Doe", "John Doe", "Harry Potter", "Hermione Granger"]
  

Мне нужно найти способ создать:

 ["Jane", "John", "Harry", "Hermione"]
  

Я подозреваю, что ответ заключается в использовании .forEach и .Split() , но пока не смог его взломать…

Комментарии:

1. Разбить на пробел, вернуть первый элемент… return person.name.split(' ')[0]

2. Когда я впервые начал программировать, Джейн было около 23: D Спасибо, что сохранили их возраст, lol

Ответ №1:

Вы можете использовать Array.map() и String.split(), чтобы решить эту проблему. По сути, вам нужно сопоставить каждое fullname с first name , поэтому, используя split by space character для every fullname , мы можем получить массив имен, и первым элементом этого массива будет the first name .

 const input = ["Jane Doe", "John Doe", "Harry Potter", "Hermione Granger"];

let res =  input.map(name =>
{
    [first, ...rest] = name.split(" ");
    return first;
});

console.log(res);  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Другой альтернативой является использование String.match() с положительным регулярным выражением, т.е. Сопоставление начальной последовательности символов, за которыми следует a space .

 const input = ["Jane Doe", "John Doe", "Harry Potter", "Hermione Granger"];
let res =  input.map(name => name.match(/^.*(?=s)/)[0]);
console.log(res);  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Комментарии:

1. Однострочный: input.map(x => x.split(' ')[0])

Ответ №2:

В вашей функции map попробуйте var names = person.name.split(» «); и верните имена[0];

Комментарии:

1. Вот и все! @charlietfl сказал то же самое, слегка перефразированное выше в комментариях: «Разбить на пробел, вернуть первый элемент… return person.name.split(‘ ‘)[0]» Оба отлично работают.

Ответ №3:

в случае, если вам разрешено использовать forEach свойство, вы можете захотеть:

 dataSet.forEach( function( x ) { console.log( x.name.match( /w /) "" ) } );
  

в противном случае вам придется научиться использовать while цикл.