Назначить массив индексов как значение объекта - PullRequest
0 голосов
/ 07 октября 2019

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

const appleHolderLine = ['Rome', 'Ambrosia', 'Rome', 'RedDelicious', 'Akane','RedDelicious', 'SweeTango', 'RedDelicious', 'RedDelicious', 'Opal', 'Winesap', 'RedDelicious', 'Empire', 'RedDelicious', 'Liberty'];

Во-первых, необходимо объявить переменную lineCount, которая рассчитывает для каждого элемента массива, и ссылку на объект с именем appleMap.

Тогда задача заключалась в циклическом прохождении по массиву, и элементы массива были бы ключами объекта без дубликатов, а значения были бы массивом идексов конкретного места элемента массива. Чтобы привести пример, как это должно выглядеть:

Пример:

const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
console.log (lineCount, appleMap) 

Должен войти:

5, {'GreenApples':[0], 'RedDelicious': [1,4], 'OrangeApples':[2], 'PurpleApples': [3]}

Мой прогресс до сих пор

var lineCount = 0;
var appleMap = {};
for (let i = 0; i < appleHolderLine.length; i++){
    lineCount++;
    // if element in the array exist in the array  
    appleMap[appleHolderLine[i]] = [i];
}

Не могли бы вы дать мне подсказку, как решить эту проблему, я действительно застрял.

Ответы [ 3 ]

1 голос
/ 07 октября 2019

Как правило, вы можете создать пустой массив в первый раз и продолжать нажимать, как показано ниже

var lineCount = 0;
var appleMap = {};
for (let i = 0; i < appleHolderLine.length; i++){
  lineCount++;
  if(!appleMap[appleHolderLine[i]])
    appleMap[appleHolderLine[i]] = []
  appleMap[appleHolderLine[i]].push(i);

 }

Вы можете использовать Array.prototype.reduce, который представляет собой более продвинутую конструкцию javascript. Пожалуйста, обратитесь к ответу CodeManiac ниже для того же. Приведенный выше ответ должен прояснить основную идею и подсказку о том, как вы можете думать

Кроме того, lineCount можно получить, используя appleHolderLine.length напрямую.

0 голосов
/ 07 октября 2019

Полагаю, самый короткий ответ - функциональный.

const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']

result = appleHolderLine.reduce((a,c,i) => { if(a[c]) a[c].push(i); else a[c]=[i]; return a; }, {})

console.log(result)

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

0 голосов
/ 07 октября 2019

Вам не нужна дополнительная переменная (счетчик строк), просто зациклите использование значения, используйте индекс для доступа к значению, проверьте, нет ли ничего для этого ключа, затем просто инициализируйте его пустым массивом, нажмите индекс дляключ в каждой итерации

const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']
var appleMap = {};
for (let i = 0; i < appleHolderLine.length; i++){
  if(!appleMap[appleHolderLine[i]]){
    appleMap[appleHolderLine[i]] = []
  }
  appleMap[appleHolderLine[i]].push(i);
}

console.log(appleMap)

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

const appleHolderLine = ['GreenApples', 'RedDelicious','OrangeApples', 'PurpleApples', 'RedDelicious']

let final = appleHolderLine.reduce((op,inp,i)=>{
  op[inp] = op[inp] || []
  op[inp].push(i)
  return op
},{})


console.log(final)

Количество строк просто равно длине массива, let lineCount = appleHolderLine.length

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