Слова группы Javascript в массиве с одинаковым начальным символом - PullRequest
1 голос
/ 13 мая 2019

В настоящее время я изучаю javascript, и у меня есть проблема, пытаясь выяснить, как справиться с этой проблемой:

У меня есть массив слов со специальным знаком вопроса, например,

wordsArray = ["почему", "бы", "вы", "заплатить", "за", "а", "телефон", "?"];

Я пытаюсьгрупповые слова с одним и тем же начальным символом в одной и той же отдельной группе массива. Пример вывода:

firstArray = ["why", "would"] //<- all start with w
secondArray = ["you"]
thirdArray = ["pay", "phone"]//<- all start with p
fourthArray = ["for"]
fifthArray = ["a"] 
finalArray = ["?"]//<- special character like ?, :,.. in the same group

Как мне этого добиться?я ошибся в этом, и вопрос выглядит так, как будто я прошу коды, но на самом деле я прошу решение, как это решить (логично)

Ответы [ 5 ]

4 голосов
/ 13 мая 2019

Вы можете использовать Array.reduce

const wordsArray = ["why", "would", "you", "pay", "for", "a", "phone", "?"];

const binned = wordsArray.reduce((result, word) => {
  // get the first letter. (this assumes no empty words in the list)
  const letter = word[0];
  
  // ensure the result has an entry for this letter
  result[letter] = result[letter] || [];
  
  // add the word to the letter index
  result[letter].push(word);
  
  // return the updated result
  return result;
}, {})

console.log(binned);
2 голосов
/ 13 мая 2019

Вы можете использовать функцию reduce, но для всех специальных символов используйте один массив. Вы можете инициализировать аккумулятор объектом с ключом по умолчанию special. В функции уменьшенного обратного вызова проверьте, есть ли у этого аккумулятора ключ, который является первой буквой текущего элемента в итерации. Если это так, введите текущее значение в массиве key

let wordsArray = ["why", "would", "you", "pay", "for", "a", "phone", "?","-"];
var regex = /^[a-zA-Z0-9]*$/;
let grouped = wordsArray.reduce(function(acc, curr) {
  
  let isSpecial = regex.test(curr);

  if (!isSpecial) {
    acc.special.push(curr)
  } else if (acc.hasOwnProperty(curr.charAt(0))) {
    acc[curr.charAt(0)].push(curr)
  } else {
    acc[curr.charAt(0)] = [curr]

  }
  return acc;

}, {
  special: []
})

console.log(grouped)
1 голос
/ 13 мая 2019

С ES6 это было бы примерно так с Array.reduce и Object.values ​​:

let data  = ["why", "would", "you", "pay", "for", "a", "phone", "?"];

let result = data.reduce((r,c) => {
  r[c[0]] = r[c[0]] ? [...r[c[0]], c] : [c]
  return r
}, {})

console.log(Object.values(result))

Идея состоит в том, чтобы создать группировку, взяв первый символ текущего слова c[0].

0 голосов
/ 13 мая 2019

Использование reduce:

const arr = ["why", "would", "you", "pay", "for", "a", "phone", "?"];

const res = arr.reduce((acc, [f, ...l]) => {
  (acc[f] = acc[f] || []).push(f + l.join(""));
  return acc;
}, {});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 13 мая 2019

const wordsByLetter = arr.reduce ((wordsByLetter, word) => {if (Array.isArray (wordsByLetter [word.charAt (0)])) wordsByLetter [word.charAt (0)]. Push (word); else wordsByLetter [word.charAt (0)] = [word]; вернуть wordsByLetter), {}); const arraysOfWords = Object.values ​​(wordsByLetter);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...