Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Логика в JS, не понимаю (https://javascript.ru/forum/misc/84900-logika-v-js-ne-ponimayu.html)

Сергей Ракипов 01.02.2023 22:44

Логика в JS, не понимаю
 
Я вот не могу понять эту логику.
Сразу скажу код работает как должен но я просто не могу понять как.

const a = [1, 2, 3]
const b = [1, 2, 3]
const c = [2, 1, 3]

const areArraysEqual = (firstArray, secondArray) => {

    if(firstArray.every((el, ind) => el === secondArray[ind])
    ){
        return true
    }

    return false
}

console.log(areArraysEqual(a, b)) // true
console.log(areArraysEqual(a, c)) // false


Есть два массива я хочу проверить совпадают ли там элементы.
И для этого создаю проверку с помощью метода every где есть два параметра элемента и индекса. Происходит следующее что берется элемент первого массива и сравнивается с элементом второго массива исходя из номера его индекса. И все работает.

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

рони 01.02.2023 23:13

Цитата:

Сообщение от Сергей Ракипов
там же разные значения.

alert(1 === 1)

что не так?

Сергей Ракипов 02.02.2023 00:27

рони,
тут просто тип данных сравнен

а в моем примере сравниваются два массива
const a = [1, 2, 3]
где 1, 2, 3 это элементы у которых индекс 0 1 2

я вижу это сравнение так 1 !== 0 true

рони 02.02.2023 00:48

Сергей Ракипов,
вы когда обратились к массиву по индексу, то получили элемент.
(el, ind) => el === secondArray[ind])
el это firstArray[ind] или
(a[0], 0) => a[0] === b[0] или
(1, 0) => 1 === 1

Сергей Ракипов 02.02.2023 01:00

рони,
вот это что вы написали (a[0], 0) как я понял а это массив [0] это индекс массив а через запятую 0 это что?

рони 02.02.2023 01:38

Сергей Ракипов,
(элемент_массива_под_индекс ом_таким-то, индекс_такой_то)

рони 02.02.2023 01:44

Сергей Ракипов,
есть два дома , есть номера квартир, есть жильцы этих квартир, никто жильца не сравнивает с номером его квартиры, сравнивают жильцов по номеру.
в первом доме, в нулевой комнате живёт единица и во втором доме, в нулевой комнате тоже живёт единица.

рони 02.02.2023 01:47

Сергей Ракипов,
(el, ind) => el === secondArray[ind])
(firstArray[ind] , ind) => firstArray[ind] === secondArray[ind])
(a[0], 0) => a[0] === b[0]
(1, 0) => 1 === 1
все эти строки это одно и тоже для первого шага перебора элементов массива

Сергей Ракипов 02.02.2023 02:12

Я вот сколько лет возвращаясь вновь и вновь освоить JS иногда думаю это не моё.

Я вот так думаю
дом это массив a[1, 2, 3]
номера квартир это а[0 1 2] (то есть индекс для меня номер квартир) (далее я назову это ind)
а жильцы это a[1, 2, 3] (элементы этого массива, то есть они могут быть числа, строки, переменные и т.д.) (далее я назову это el)

И когда мне говорят сравни жильцов двух домов и если они одинаковые выведи тру

a[1, 2, 3]
в[1, 2, 3]

я беру метод every который мне скажет номера домов и кто в них живет (это в параметрах el жилец и ind квартира), то есть индекс 0 1 3 это квартиры и в них живут жильцы 1,2,3 соответственно



И вот из первого дома я имею жильца 1 А из второго дома я беру номер квартиры
И мне говорят это одинаково или тру
А у меня не доумение ну как же так это же вообще нельзя сравнивать.

рони 02.02.2023 09:08

Цитата:

Сообщение от Сергей Ракипов
И вот из первого дома я имею жильца 1 А из второго дома я беру номер квартиры

и берёте жильца по номеру квартиры
Цитата:

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

Белый шум 02.02.2023 10:02

Цитата:

Сообщение от Сергей Ракипов (Сообщение 550366)
рони,
вот это что вы написали (a[0], 0) как я понял а это массив [0] это индекс массив а через запятую 0 это что?

Разве в документации что-то непонятно написано? - https://developer.mozilla.org/ru/doc...ts/Array/every

["a", "b", "c", "d"].every(
 (el, ind, arr) => {
    console.log("el=" + el, "ind=" + ind, "arr=" + arr);
    return true;
 }
);

Сергей Ракипов 02.02.2023 21:21

Цитата:

Сообщение от рони (Сообщение 550373)
и берёте жильца по номеру квартиры

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

читать тут

про как указать номер массива я знаю

Сергей Ракипов 02.02.2023 21:59

Цитата:

Сообщение от Белый шум (Сообщение 550374)
Разве в документации что-то непонятно написано? - https://developer.mozilla.org/ru/doc...ts/Array/every

["a", "b", "c", "d"].every(
 (el, ind, arr) => {
    console.log("el=" + el, "ind=" + ind, "arr=" + arr);
    return true;
 }
);

К описанию у меня нет вопросов, я уже сдался это не так важно, просто я по другому не могу объяснить как я воспринимаю логику этого кода. Мне проще запомнить что это работает так и все.

Если только JS думает так есть массив иду по индексам, смотрю что находится в этом индексе, "запомнил" беру следующий массив иди по индексам и уже после этого сравниваю что находится в этом индексе.

В коде то просто написано 1 как значение сравни с 0 как с положением массива.

voraa 02.02.2023 22:09

Цитата:

Сообщение от Сергей Ракипов
В коде то просто написано 1 как значение сравни с 0 как с положением массива.

В коде написано
Цитата:

Сообщение от Сергей Ракипов
el === secondArray[ind]

el - значение из первого массива, secondArray[ind] - значение по индексу ind из второго массива
ind - индекс
secondArray[ind] - значение по этому индексу

Сергей Ракипов 02.02.2023 22:57

Спасибо что помогаете разобраться.

Белый шум 03.02.2023 06:31

Цитата:

Сообщение от Сергей Ракипов (Сообщение 550395)
Если только JS думает так есть массив иду по индексам, смотрю что находится в этом индексе, "запомнил" беру следующий массив иди по индексам и уже после этого сравниваю что находится в этом индексе.

По индексам массива идёт только функция every:
Код:

firstArray.every( )
И только по индексам одного массива - того, который указан перед ней через точку. Т.е. в данном случае она идёт по индексам массива firstArray.

И когда она проходит по индексам этого массива, она запускает для каждого его элемента функцию, которую ей передали в качестве параметра. В вашем случае это стрелочная функция:
Код:

(el, ind) => el === secondArray[ind]
где (el, ind) - это параметры данной функции. Значения в эти параметры передаёт every (при каждом запуске этой стрелочной функции значения будут разными).

Вот и вся логика. По индексам второго массива никто не проходит.

MallSerg 03.02.2023 08:33

Цитата:

И вот из первого дома я имею жильца 1 А из второго дома я беру номер квартиры
В этом утверждении содержится логическая ошибка которая приводит к ошибочным выводам.
С точки зрения формальной логики это нарушение третьего закона логики "Исключенный третий" т.е. понятие "беру номер квартиры" не верно и не может использоваться в логическом рассуждении потому что фактически используется синтаксическая конструкция которая представлена выражением и уже в этом выражении используется так называемое "беру номер квартиры" как часть этого выражения возвращающего жильца.
Т.е. вместо целого используемого выражения в логике используется только его часть это и есть то самое "подмена понятия".

voraa 03.02.2023 11:49

На самом деле это надо читать так
И вот из первого дома я имею жильца 1. А из второго дома я беру номер квартиры

Сергей Ракипов 04.02.2023 04:06

Цитата:

Сообщение от MallSerg (Сообщение 550432)
С точки зрения формальной логики это нарушение третьего закона логики "[url="https://www.google.com/search?q=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B 5%D0%BD%D0%BD%D1%8B%D0%B9+%D1%82%D1%80%D0%B5%D1%82 %D0%B8%D0%B9&sourceid=chrome&ie=UTF-8"].

спасибо почитал

Сергей Ракипов 04.02.2023 04:48

Скажу сразу код работает просто не до конца понимаю.

const inputProducts = [
  {
    title: 'Phone case',
    price: 23,
    quantity: 2,
    category: 'Accessories',
  },
  {
    title: 'Android phone',
    price: 150,
    quantity: 1,
    category: 'Phones',
  },
  {
    title: 'Headphones',
    price: 78,
    quantity: 1,
    category: 'Accessories',
  },
  {
    title: 'Sport Watch',
    price: 55,
    quantity: 2,
    category: 'Watches',
  },
]

const quantitiesByCategories = (products) => {

  return products.reduce((qtyByCategories, product) => {

    const {category, quantity} = product

    qtyByCategories[product.category] =  (qtyByCategories[product.category] || 0) + product.quantity

    return qtyByCategories
    
  }, [])
}  

console.log(quantitiesByCategories(inputProducts))


1) Как вот этот параметр product понял что он будет объектом этого массива inputProducts

2) Почему [product.category] решило что она возьмет значение этого свойства category: 'Accessories' и станет ключом нового объекта

3) Как происходит суммирование quantity за счет этой записи (qtyByCategories[product.category] || 0) + product.quantity

Сергей Ракипов 04.02.2023 05:40

1) Как вот этот параметр product понял что он будет объектом этого массива inputProducts

Вот это я понял
reduce взял массив products и вторым аргументом product взял элемент из этого массива

voraa 04.02.2023 09:27

Может все таки самому почитать как следует учебник.
Тут трудно написать больше, чем там написано.
2 Ну вот так язык js устроен.
К свойству можно обратиться и product.Accessories и product['Accessories']
3 Если product.Accessories != undefined (нет такого свойства) или 0 или null, или false или '', то взять в место него 0 (|| 0). иначе взять само значение product.Accessories и прибавить к нему product.quantity
Результат запихнуть в product.Accessories (если такого свойства нет, оно будет создано).

Сергей Ракипов 04.02.2023 16:50

почему вот эта часть qtyByCategories[product.category] стала значением вот этого свойства quantity:

voraa 04.02.2023 19:04

А она не стала.
qtyByCategories - это новый объект, изначально пустой, в который запихиваются свойства с именами из product.category, а значение накапливается сумма из quantity.
Читать и учить как работает reduce.

Сергей Ракипов 05.02.2023 03:27

voraa,
спасибо

Сергей Ракипов 09.02.2023 11:55

Кто может объяснить почему тут два оператора return

И почему JS понимает что после оператора + он должен сложить значение rating: elem.rating + 100 есть какое то правило синтаксиса ?

const test = [
        {
            author: 'a',
            category: "nub",
            rating: 10,
        },
        {
            author: 'b',
            rating: 20,

        },
        {
            author: 'c',
            category: "nub",
            rating: 30,
        },
    ]
    const fn = (arr) => {
        return arr.map((elem) => {
            return {
                avtor: elem.author,
                category: elem.category === undefined ? "nub" : elem.category,
                rating: elem.rating + 100
            }
        })
    }
    const testCopy = fn(test)
    console.log(testCopy);

voraa 09.02.2023 15:00

const fn = (arr) => {
        return arr.map((elem) => {
            return {
                avtor: elem.author,
                category: elem.category === undefined ? "nub" : elem.category,
                rating: elem.rating + 100
            }
        })
    }


Первый return относится к функции fn, а второй к функции, которая передается в map
Цитата:

Сообщение от Сергей Ракипов
почему JS понимает что после оператора + он должен сложить

Потому, что оператор + складывает значения, которые слева и справа от него.

Сергей Ракипов 10.02.2023 04:45

Цитата:

Сообщение от voraa (Сообщение 550569)

Первый return относится к функции fn, а второй к функции, которая передается в map

Потому, что оператор + складывает значения, которые слева и справа от него.

А в каких случай нужно еще дважды написать return?
Просто как я думаю что написал функцию и сказал ее вернуть значение. И как бы достаточно. Не совсем понятно почему после того как я функции сказал врени результат своей работы нужно еще раз внутри написать верни. Может быть есть какие то правила которые просят писать возврат дважды

Вот тут JS avtor: elem.author, он понял что нужно изменить ключ.

А вот тут rating: elem.rating + 100 он понял что нужно сложить значение. Хотя визуально можно понять что оставь имя прежним просто напиши еще 100 которое переведется в строку. Хотя признаю может и звучит как то идиотский. Просто какое то правила синтаксиса что если написано так то будет делать такие действие если по другому то другие.

voraa 10.02.2023 07:34

Цитата:

Сообщение от Сергей Ракипов
А в каких случай нужно еще дважды написать return?

return можно и нужно писать столько раз, сколько нужно. Например так
function sign (x) {
   if (x<0) return -1;
   if (x>0) return 1;
   return 0;
}

Если функция должна вернуть значение, то у нее должен быть хотя бы один return. Если используются две такие функции, значит надо будет написать return 2 раза.

Цитата:

Сообщение от Сергей Ракипов
Просто какое то правила синтаксиса что если написано так то будет делать такие действие если по другому то другие.

Есть простое правило. значение свойства при задании литерала объекта можно задавать выражением.

Сергей Ракипов 10.02.2023 09:46

voraa,
спасибо

Сергей Ракипов 10.02.2023 10:00

Цитата:

Сообщение от voraa (Сообщение 550578)
значение свойства при задании литерала объекта можно задавать выражением.

И правильно ли я понял если по простому то это означает


const test = {
value: a
}


вместо а могу написать в

const test = {
value: в
}


Часовой пояс GMT +3, время: 12:42.