создать многомерный массив, а затем нажать еще один массив каждый из этих многомерных массивов - PullRequest
0 голосов
/ 26 декабря 2018

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

arr = ["apple", "orange",  "Avocados", "Tomato", "Tangerine"]

и вывод, который я хочу:

[
  ["a", ["apple", "avocados"] ], 
  [ "o", ["orange"] ], 
  ["T", ["Tomato", "Tangering"]]
]

пример создания первого начального значения для нового arr многомерного перед выводом, мы создаем так, [[ "a"],["o"],["T"]] и вывод, который я хочу, находится выше (код блока)

затем снова проверьте, совпадает ли это первое начальное значение с первым начальным массивом, вставьте его в эти 2-мерные массивы, например, но если длина массива для других не совпадает, мы должны создать функцию, чтобы использоватьопять поздно

Ответы [ 5 ]

0 голосов
/ 26 декабря 2018

Используя reduce, создайте объект с первым char каждого элемента в качестве key и массивом всех элементов, которые начинаются с этого символа как value.Затем вызовите Object.entries, чтобы получить желаемый результат:

const arr = ["apple", "orange",  "avocados", "tomato", "tangerine"],
group = Object.entries(arr.reduce((a, i) => ((a[i[0]] = a[i[0]] || []).push(i), a), {}));

console.log(group);
0 голосов
/ 26 декабря 2018

Еще одна альтернатива, использующая ванильный JavaScript и некоторое функциональное программирование:

const input = ["apple", "orange", "Avocados", "Tomato", "Tangerine"]

// (1) An unique list of lower-cased initials of all given input words
// * Set gives us the unique behavior
const initials = [...new Set (
      input.map (([initial]) => initial.toLowerCase ())
)]

const byInitial = ([initial]) => ([initial_]) => 
      initial_.toLowerCase () == initial

// (2) This groups each world by their initial
// Iterates each lowered initial and filters the input by each initial 
// to build the groups!
const grouped = initials.reduce ((o, initial) =>
    [
      ...o, // <--- this accumulates the new result with the previous one
      [
        initial, 
        input.filter (byInitial(initial))
      ]
    ], [])
    
console.log (grouped)

Еще один подход, теперь использующий zip:

const input = ["apple", "orange", "Avocados", "Tomato", "Tangerine"]

// (1) An unique list of lower-cased initials of all given input words
// * Set gives us the unique behavior
const initials = [...new Set (
      input.map (([initial]) => initial.toLowerCase ())
)]

const byInitial = ([initial]) => ([initial_]) => 
      initial_.toLowerCase () == initial

// (2) This builds groups each world by their initial
const groups = initials.map (initial => 
      input.filter (byInitial (initial))
)

const zip = (xs, ys) => 
      xs.map((x, i) => [x, ys[i]])
      
// zip builds the pairs, where each one is the initial and the group
const grouped = zip (initials, groups)
    
console.log (grouped)
0 голосов
/ 26 декабря 2018

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

var array = ["apple", "orange", "avocados", "tomato", "tangerine"],
    result = array.reduce((r, s) => {
        var temp = r.find(([c]) => c === s[0]);
        if (temp) {
            temp[1].push(s);
        } else {
            r.push([s[0], [s]]);
        }
        return r;
    }, []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Лучшей структурой было бы использование Map и сбор всех строк в одну и ту же начальную букву.

var array = ["apple", "orange", "avocados", "tomato", "tangerine"],
    result = Array.from(
        array.reduce((map, s) => map.set(s[0], [...(map.get(s[0]) || []), s]), new Map)
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 декабря 2018

Вы можете уменьшить массив до объекта

var arr = ["apple", "orange",  "Avocados", "Tomato", "Tangerine"];

var output = arr.reduce(function(res, item) {
  if(Object.keys(res).indexOf(item.charAt(0).toLowerCase()) == -1) 
  {
    res[item.charAt(0).toLowerCase()] = [];
  }
  res[item.charAt(0).toLowerCase()].push(item);
  return res;
},{});

console.log(output);
0 голосов
/ 26 декабря 2018

Я думаю, что ваш вывод слишком сложен для производства.Вы можете упростить формат вывода следующим образом:

{
   "a" : ["apple", "avocados"], 
   "o": ["orange"], 
   "t": ["Tomato", "Tangering"] 
 }

Вы можете с легкостью производить вывод, как это, с помощью Lodash:

_.groupBy(["apple", "orange",  "Avocados", "Tomato", "Tangerine"], function (item) {
  return item[0].toLowerCase()
});

Или с итерацией массива:

var arr = ["apple", "orange",  "Avocados", "Tomato", "Tangerine"];
var output = [];
for (var i = 0 ; i < arr.length ; i++){
  if (output[arr[i][0].toLowerCase()] == undefined)
    output[arr[i][0].toLowerCase()] = [];
  output[arr[i][0].toLowerCase()].push(arr[i]);
}
...