Есть ли способ в JQuery перебирать массив строк и возвращать новые массивы, которые сортируют совпадающие строки в этом массиве? - PullRequest
0 голосов
/ 02 августа 2020

Я только изучаю jQuery, и это один из моих первых проектов, поэтому извиняюсь, если это простой вопрос.

Допустим, у меня есть такой массив:

const array = ["electric", "fire", "flying", "electric", "water", "electric", "water", "electric", "fire", "flying", "electric", "water"];

Я хочу иметь возможность вернуть 4 новых массива в этом случае, как показано ниже:

[“electric”, “electric”, “electric”, “electric”, “electric”]
[“fire”, “fire”]
[“flying”, “flying”]
[“water”, “water”, “water”] 

Я пробовал прочитать здесь различные методы массива и некоторые из ранее заданных вопросов, но я не Я не вижу ничего, что относится к этому.

Ответы [ 4 ]

1 голос
/ 03 августа 2020

Вы можете использовать простой map для группировки элементов:

const array = ["electric", "fire", "flying", "electric", "water", "electric", "water", "electric", "fire", "flying", "electric", "water"];
let map = {};
for(let i = 0; i < array.length; i++){
     let item = array[i];
     if(!map[item])
          map[item] = [ item ];
     else
          map[item].push(item);
}
console.log(Object.values(map));
1 голос
/ 03 августа 2020

Вы можете использовать Array#reduce с объектом для хранения массива для каждого элемента, чтобы создать массив массивов.

const array = ["electric", "fire", "flying", "electric", "water", "electric", "water", "electric", "fire", "flying", "electric", "water"];
const res = Object.values(
     array.reduce(
      (acc,curr)=>((acc[curr]=acc[curr]||[]).push(curr), acc), {}
     )
);
console.log(res);
0 голосов
/ 03 августа 2020

Добро пожаловать в Stack Overflow. Надеюсь, тебе здесь нравится. Не стесняйтесь воспользоваться Tour и узнать, как предоставить минимальный воспроизводимый пример

Вы можете использовать методы массива .map() и .filter() - вы действительно jQuery для этого не нужно - а вот:

let chunks = array.map(a => array.filter(x => x === a))
    .filter((item, index) => array.indexOf(item[0]) === index);

const array = ["electric", "fire", "flying", "electric", "water", "electric", "water", "electric", "fire", "flying", "electric", "water"];
let chunks = array.map(a => array.filter(x => x === a)).filter((item, i) => array.indexOf(item[0]) === i);

console.log( chunks );
0 голосов
/ 03 августа 2020

Это должно работать:

const array = ["electric", "fire", "flying", "electric", "water", "electric", "water", "electric", "fire", "flying", "electric", "water"]

console.log(array.reduce((acc, el) => {
    acc[el.charAt(0)] = acc[el.charAt(0)] ? [...acc[el.charAt(0)], el] : [el]; 
    return acc
}, {}))

Вы reduce элемент, и вы создаете результирующий объект на основе:

  1. , если уже есть запись для этой первой буквы , pu sh текущий элемент
  2. в противном случае свяжите с этой записью текущую первую букву и массив только с текущим элементом

ПРИМЕЧАНИЕ: вы можете фактически уменьшить его до ассоциативный массив, зависит от вас, какой из них лучше соответствует вашим требованиям

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