Как найти совпадение в массиве и вернуть его ключ?

167
27 июля 2018, 10:50

В общем, дело тёмное. У меня есть массив вида ключ: значение:

var arr1 = [];
$('select').each(function() {
    if ($(this).val() != 0) {
        arr1[$(this).attr('name')] = $(this).find('option:selected').text();
    }
}); 
/* получаем массив: var arr1 = [,,,,,'Россия, Москва',,,,,,,,,,,,,,,,'Россия, Брянск']; */

И формирование нового массива объектов, куда нужно занести ключ, если значение найдено в 1-ом массиве:

<select id="example_select"> 
    <option value="0">Россия, Москва</option>  
    <option value="1">Россия, Ростов</option> 
    <option value="2">Россия, Сочи</option> 
    <option value="3">Россия, Брянск</option> 
</select>

var arr2 = [];
$('#example_select option').each(function() {
    arr2[arr2.length] = {
        'address': $(this).text(), // Сюда попадет строка с адресом: Россия, Москва
        'id':  /* а вот здесь должен быть индекс найденного адреса, если не удалось найти, тогда 0 */
    }
});

Как мне получить такой вот результат?

arr2 = [
   {address: "Россия, Москва", id: "5"},
   {address: "Россия, Ростов", id: "0"},
   {address: "Россия, Сочи", id: "0"},
   {address: "Россия, Брянск", id: "21"}
]
Answer 1

Можно создать новый массив объектов на основе текущего при помощи #array.map(), а потом почистить от undefined.

const array = [,,,,"first",,,,,,,,,,,,,"second",,,,,,,,"third"] 
 
const mappedArray = array.map((item, index) => { 
  return { 
      address: item, 
      id: index 
    }   
}).filter(item => { 
  if (typeof item !== undefined) return item 
}) 
 
console.log(mappedArray)

Answer 2

Решение

Во-первых у вас это просто массив, а не "массив вида (ключ, значение)". Цифры перед значением, являются индексами, фактически массив их не содержит!

Можно просто перебрать через for

function arrayToObjArray(array) { 
  let result = []; 
  for (let i = 0; i < array.length; ++i) { 
    let obj = {}; 
    obj.id = i; 
    obj.address = array[i]; 
    result.push(obj); 
  } 
  return result; 
} 
 
let someArray = ['Moscow', 'Samara', 'Perm']; 
 
console.log(arrayToObjArray(someArray));

Answer 3

Ни один из предложенных вариантов не является решением моей проблемы, сегодня еще погуглил, посидел, почесал репу, и решил задачу:

var arr1 = arr1 = [,,,,,'Россия, Москва',,,,,,,,,,,,,,,,'Россия, Брянск'], 
    arr2 = []; 
 
$('#example_select option').each(function() { 
  if ($(this).val() != 0) { 
    var get_index = arr1.findIndex(item => item === $(this).text()); 
    arr2[arr2.length] = { 
      'addres': $(this).text(), 
      'id': (get_index > 0) ? get_index : 0 
    } 
  } 
}); 
 
console.log(arr2);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id="example_select"> 
    <option value="0">Адрес не выбран</option>  
    <option value="1">Россия, Москва</option> 
    <option value="2">Россия, Ростов</option> 
    <option value="3">Россия, Сочи</option> 
    <option value="4">Россия, Брянск</option> 
</select>

p.s. В заголовке вопроса я просил помочь найти индекс по заданному значению, никто не подсказал мне про findIndex, вместо этого, люди начали задавать глупые вопросы и предлагать совершенно нелепые варианты будто не хотели вникать и написали на оте***сь, вместо адекватной помощи комьюнити я получил дизлайки вопроса (на то есть причины естественно, надо было сразу поработать над описанием) и не получил верного ответа, даже логически никто не понял какой результат я хотел получить, хотя всё вроде разжевал. Очень не порадовал результат в общем...

Answer 4

Если имеется в виду работа с DOM с помощью jQuery, то в колбэк each передается индекс:

$('#example_select option').each(function(index) {
    ...

То есть если есть какойто DOM

<select id="example_select">
    <option value="5">Россия, Москва</option> 
    <option value="21">Россия, Брянск</option>
</select>

То желаемый результат можно получить так:

var arr2 = [];
$('#example_select option').each(function(index) {
    arr2.push({
        'address': $(this).text(),
        'id':  $(this).val()
    })
});

На выходе получите:

arr2 = [
   {address: "Россия, Москва", id: "5"},
   {address: "Россия, Брянск", id: "21"}
]    

Оставшиеся элементы, не встречающиеся в select, добавите отдельно.

READ ALSO
неправильная работа jQuery

неправильная работа jQuery

День добрый! Подскажите в чём может быть проблемаПоменял системный блок и начались проблемы

205
Сменить цвет кнопок js

Сменить цвет кнопок js

Есть массив с данными, там есть кнопки, мне нужно чтобы при нажатие на конкретную кнопку менялся цвет только этой кнопки

176
QUERY FOR NUMBERS IN MYSQL

QUERY FOR NUMBERS IN MYSQL

Здравствуйте у меня такой вопросесть одна таблица в котором есть число до 10 нужно писать query который нам дает все четные и нечетные числи

169
Действия над переменной

Действия над переменной

Скажите пожалуйста как "перечислять" действия на переменной?

134