Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.05.2022, 03:33
Интересующийся
Отправить личное сообщение для pingu Посмотреть профиль Найти все сообщения от pingu
 
Регистрация: 31.08.2021
Сообщений: 15

При сравнении массивов не могу правильно вывести индексы совпадающих в них элементов!
Доброго времени суток уважаемые форумчане.Помогите решить проблему,я в тупике в полном и не знаю что с этим делать,буду рад любой помощи. Суть проблемы: есть два массива:
var arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.01];
var arr2 = [1.58, 0.1, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.01];

Мне нужно сравнить второй массив с первым и вывести в новый массив индексы одинаковых элементов которые соответствуют индексам arr1,то есть в идеале должен получиться массив с такими индексами:
var index_etalon = [0,2,3,4,6,7,8,9,11];

Я перерыл весь интернет в итоге нашёл вот этот код,это не оригинал но изменены были только названия переменных:
var arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05,0.01];
var arr2 = [1.58, 0.1, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05,0.01];
const index_etalon = [0,2,3,4,6,7,8,9,11];
var findMatch = function(arr2_Iter, arr1_Iter) {
    let ary = [];
    for(let i = 0;i < arr1_Iter.length; i++){
        for(let z = 0; z < arr2_Iter.length; z++){
            if(arr1_Iter[i] == arr2_Iter[z]){
                ary.push(i);
                //arrIndexDelDuble = [...new Set(ary)];
            }
        }
    }
    return ary;
}

var indexiReal = findMatch(arr2, arr1)

код работает и выдаёт вот что:
[0,2,3,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11]

единственное что у меня вышло улучшить это удалить дубли и получилось так:
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
,но это не тот результат,в идеале должно быть так:
[0,2,3,4,6,7,8,9,11]

посмотреть что вышло вы можете тут:https://jsfiddle.net/navigatorus/znLptxa7/74/
У кого есть идеи или готовое решение,помогите,буду очень признателен!
Ответить с цитированием
  #2 (permalink)  
Старый 05.05.2022, 07:41
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Нет уверенности, что точно понял правила, но может так сойдет
const arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05,0.01];
const arr2 = [1.58, 0.1, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05,0.01];
const findMatch = function(arr2_Iter, arr1_Iter) {
    let ary = [];
    let arr2_Copy = arr2_Iter.slice(0)
    for(let i = 0;i < arr1_Iter.length; i++){
        for(let j = 0; j < arr2_Copy.length; j++){
            if(arr1_Iter[i] == arr2_Copy[j]){
				arr2_Copy[j] = NaN;
                ary.push(i);
                break;
            }
        }
1    }
    return ary;
}
  
const indexiReal = findMatch(arr2, arr1)
console.log(indexiReal);
Ответить с цитированием
  #3 (permalink)  
Старый 05.05.2022, 08:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

pingu,
шифровка из центра...
let arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.01];
        let arr2 = [1.58, 0.1, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.01];
        function arrIndex(a, b) {
            let ob = {};
            return b.reduce((ar, el) => {
                let k = ob[el] ??= 0;
                k = a.indexOf(el, k);
                ar.push(k);
                ob[el] = ++k;
                return ar;
            }, [])
        }
        console.log(arrIndex(arr1, arr2))

Последний раз редактировалось рони, 05.05.2022 в 09:46.
Ответить с цитированием
  #4 (permalink)  
Старый 05.05.2022, 08:52
Интересующийся
Отправить личное сообщение для pingu Посмотреть профиль Найти все сообщения от pingu
 
Регистрация: 31.08.2021
Сообщений: 15

voraa,рони!Ребята вы гении.Спасибо.Вы меня спасли.Это фантастика!Два варианта и два работают!Ещё раз спасибо за ваше мастерство!Ребят как в карму плюсануть?Что то не выходит.

Последний раз редактировалось pingu, 05.05.2022 в 08:55.
Ответить с цитированием
  #5 (permalink)  
Старый 05.05.2022, 09:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

pingu,
findIndex заменил на indexOf.
Ответить с цитированием
  #6 (permalink)  
Старый 05.05.2022, 09:55
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Сообщение от рони
findIndex заменил на indexOf.
Не понятны условия задачи
Если в arr2, будет элемент, которого нет в arr1, то там в результате будут -1 присутствовать

let arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.01];
        let arr2 = [1.58, 0.1, 0.06, 0.06, 0.07,  0.05, 0.05, 0.05, 0.05, 0.01];
        function arrIndex(a, b) {
            let ob = {};
            return b.reduce((ar, el) => {
                let k = ob[el] ??= 0;
                k = a.indexOf(el, k);
                ar.push(k);
                ob[el] = ++k;
                return ar;
            }, [])
        }
        console.log(arrIndex(arr1, arr2))

Последний раз редактировалось voraa, 05.05.2022 в 09:57.
Ответить с цитированием
  #7 (permalink)  
Старый 05.05.2022, 10:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от voraa
то там в результате будут -1 присутствовать
что не так?
вопрос к автору)))
Ответить с цитированием
  #8 (permalink)  
Старый 05.05.2022, 15:10
Интересующийся
Отправить личное сообщение для pingu Посмотреть профиль Найти все сообщения от pingu
 
Регистрация: 31.08.2021
Сообщений: 15

Сообщение от voraa Посмотреть сообщение
Не понятны условия задачи
Если в arr2, будет элемент, которого нет в arr1, то там в результате будут -1 присутствовать
Да это моё упущение,я про это не упомянул.По условиям задачи в arr2 не может быть элементов которых нет в arr1.
Ещё раз спасибо,данные варианты решения представленные выше полностью соответствуют тому что я искал.Благодарю!
Ответить с цитированием
  #9 (permalink)  
Старый 05.05.2022, 22:34
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от pingu
По условиям задачи в arr2 не может быть элементов которых нет в arr1
const res = arr2.map(v => this.i = arr1.indexOf(v, this.i + 1), {i: 0})

Тогда так

Последний раз редактировалось Vlasenko Fedor, 05.05.2022 в 22:41.
Ответить с цитированием
  #10 (permalink)  
Старый 05.05.2022, 23:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Vlasenko Fedor
{i: 0}
а если нулевые элементы обоих массивов не совпадают? )))
например так ...
let arr1 = [1.58, 0.12, 0.1, 0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.01];
let arr2 = [0.1, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.01, 1.58];
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать скрытие определённых элементов при клике на один из них tupoimudak2 Элементы интерфейса 10 17.06.2017 11:39