При сравнении массивов не могу правильно вывести индексы совпадающих в них элементов!
Доброго времени суток уважаемые форумчане.Помогите решить проблему,я в тупике в полном и не знаю что с этим делать,буду рад любой помощи. Суть проблемы: есть два массива:
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/ У кого есть идеи или готовое решение,помогите,буду очень признателен! |
Нет уверенности, что точно понял правила, но может так сойдет
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); |
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)) |
voraa,рони!Ребята вы гении.Спасибо.Вы меня спасли.Это фантастика!Два варианта и два работают!Ещё раз спасибо за ваше мастерство!Ребят как в карму плюсануть?Что то не выходит.
|
pingu,
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)) |
Цитата:
вопрос к автору))) |
Цитата:
Ещё раз спасибо,данные варианты решения представленные выше полностью соответствуют тому что я искал.Благодарю! |
Цитата:
const res = arr2.map(v => this.i = arr1.indexOf(v, this.i + 1), {i: 0}) Тогда так :victory: |
Цитата:
например так ... 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]; |
Часовой пояс GMT +3, время: 01:09. |