Ваш код принимает массив чисел и целевое число / сумму. Затем он возвращает индексы в массиве для двух чисел, которые складываются до целевого числа / суммы.
Рассмотрим массив чисел, таких как [1, 2, 3]
и цель 5
. Ваша задача - найти два числа в этом массиве, которые добавляют к 5
. Один из способов решения этой проблемы - перебрать каждое число в вашем массиве и спросить себя: «Есть ли число (которое я уже видел в моем массиве), которое я могу добавить к текущему числу, чтобы получить мою сумму target
? ».
Хорошо, если мы l oop на примере массива [1, 2, 3]
, мы сначала начнем с индекса 0 с числа 1
. В настоящее время не существует чисел, которые мы уже видели, которые мы можем добавить с помощью 1
, чтобы получить нашу цель 5
, поскольку мы еще не перебрали все числа.
Итак, до сих пор мы встречали число 1
, которое было по индексу 0
. Это сохраняется в хэш-карте (ie объект) как {'1': 0}
. Где ключ - это число, а значение (0
) - индекс, по которому он был замечен.
Затем l oop продолжает индексировать 1, с текущим номером 2
. Теперь мы можем задать себе вопрос: есть ли число, которое я уже видел в моем массиве, которое я могу добавить к своему текущему номеру 2
, чтобы получить целевую сумму 5
. Количество, необходимое для добавления к текущему номеру, чтобы добраться до цели, можно получить, выполнив target-currentNumber
. В этом случае мы находимся на 2
, поэтому мы добавляем 3
, чтобы получить нашу целевую сумму. Используя hashmap / object, мы можем проверить, видели ли мы уже число 3
. Для этого мы можем попытаться получить доступ к объектному ключу 3
, выполнив obj[target-currentNumber]
. В настоящее время наш объект имеет только ключ '1'
, поэтому, когда мы попытаемся получить доступ к ключу 3
, вы получите undefined
. Это означает, что мы еще не видели число 3
, поэтому на данный момент их нельзя добавить к 2
, чтобы получить target
сумму.
Итак, теперь наш объект / hashmap выглядит как {'1': 0, '2': 1}
, так как мы видели число 1
, которое было в индексе 0
, и мы видели число 2
, которое было в индексе 1
.
Наконец, мы достигли последнего числа в вашем массиве с индексом 2. Индекс 2 массива содержит число 3
. Опять же, мы задаем себе вопрос: есть ли число, которое мы уже видели, которое мы можем добавить к 3
(наше текущее число), чтобы получить сумму target
?. Число, которое нам нужно добавить к 3
, чтобы получить целевое число 5
, равно 2
(полученное при выполнении target-currentNumber
). Теперь мы можем проверить наш объект / hashmap, чтобы увидеть, видели ли мы уже число 2
в массиве. Для этого мы можем использовать obj[target-currentNumber]
для значения, хранящегося в ключе 2
, который является индексом 1. Это означает, что число 2
существует в массиве, и поэтому мы можем добавить его к 3
чтобы достичь нашей цели. Поскольку значение было в хэш-карте, теперь мы можем вернуть наши результаты. Это индекс того, где произошло увиденное число, и индекс текущего числа.
Как правило, хэш-карта / объект используется для отслеживания всех ранее увиденных чисел в вашем массиве и для сохранения значения индекса, по которому было видно число.
Здесь пример запуска вашего кода. Он возвращает [1, 2]
, так как числа в индексах 1
и 2
можно сложить вместе, чтобы получить целевую сумму 5
:
var twoSum = function(nums, target) {
let hash = {};
for (let i = 0; i < nums.length; i++) {
const n = nums[i];
if (hash[target - n] !== undefined) {
return [hash[target - n], i];
}
hash[n] = i;
}
return [];
}
console.log(twoSum([1, 2, 3], 5));
Для получения дополнительной информации о том, как работают объекты, вы можете прочитать о скобочных обозначениях и других методах доступа к свойствам здесь .
РЕДАКТИРОВАТЬ: Как вы просили дополнительные примеры / использования объектов / hashmaps, вот несколько примеров.
Некоторые простые случаи использования для объекта заключается в хранении пары ключ-значение. Чтобы действительно упростить его, вы можете думать об объекте / хэш-карте как о массиве, однако вместо индексов (то есть чисел) вы можете иметь «именованные» индексы. Например, у вас может быть массив, который выглядит так:
// 0 1 2 3
const person = ["James", "A", 18, 3];
Выше у нас есть массив person, который содержит информацию о person
. В индексе 0
у нас есть имя человека, в индексе 1
у нас есть начальная фамилия, в индексе 2
у нас есть возраст человека, а в индексе 3
у нас есть число членов семьи. этот человек имеет. Этот способ представления отдельного человека не очень дружелюбен, так как вы должны помнить, какую информацию содержит каждый индекс. Это не всегда легко догадаться, особенно если они содержат числа. Таким образом, вместо этого мы можем представлять одного человека, используя объект. Это по существу позволяет нам называть наши индексы (эти именованные индексы известны как keys ). Таким образом, используя приведенный выше массив, мы можем сделать что-то вроде этого, чтобы представить наш person
как объект:
const person = {
name: "James",
surname_initial: "A",
age: 18,
familyMembers: 3
}
Теперь для доступа к данным, хранящимся в name
, вы можете использовать скобочную запись (person["name"]
дает "Джеймс") или точечную запись (person.name
также дает "Джеймс"), чтобы получить значение "James"
. Это позволяет вам четко определить, что представляет собой каждый фрагмент данных.
Преимущество объектов в том, что они могут хранить только уникальные ключи. Если вы попытаетесь установить key
(например, person["age"] = 30
, то вы обновите ключ age
до значения 30
. Он не создаст 2 ключей с имя age
, вместо этого оно будет обновлять значение ключа age
до нового значения 30
. Таким образом, объекты могут быть полезны для таких вещей, как группировка или поиск уникальных значений.
Другой вариант использования объектов может заключаться в том, чтобы вести подсчет частоты элементов в массиве. Например, если у вас был массив ['a', 'b', 'a', 'a', 'b', 'c']
, и вас попросили узнать, сколько 'a'
s, 'b'
s и 'c'
s появляются в массиве, вы можете использовать для этого объект. Основная идея - l oop над вашим массивом и проверьте ваш объект, чтобы увидеть, является ли текущий элемент уже ключом в вашем объекте. это так, тогда вы можете увеличить счетчик, который он содержит, если его нет в вашем объекте, вы можете установить новый ключ в качестве текущего элемента со значением, установленным на 1
, чтобы указать, что на данный момент у вас есть только видел один из этих предметов. Это может быть достигнуто так:
const arr = ['a', 'b', 'a', 'a', 'b', 'c'];
const freq = {};
for(let i = 0; i < arr.length; i++) {
const currentItem = arr[i];
if(freq[currentItem]) { // if currentItem is a key in the freq object
freq[currentItem] = freq[currentItem] + 1; // update the currentItems counter value to be incremented
} else { // if the currentItem is not a key in the freq object
freq[currentItem] = 1; // set a new key to be the value of `currentItem`, and initialize its counter to `1`.
}
}
console.log(freq); // Output the freq object to see frequency.