Как обратиться к элементу обьекта, значение свойства которого совпадает с элементом другого массива?

102
31 декабря 2021, 11:00

Есть массив:

let mas =["обьект1","Обьект2","Обьетк3","Обьект4"];

И массив обьектов

let mas1=[
    {
        nameObj:'обьект4',
        value: 14
    },
    {
        nameObj:'обьект1',
        value: 16
    },
    {
        nameObj:'обьект2',
        value: 17
    }
];

Как выдергивать из второго массива именно то значение value, свойство nameObj которого совпадает со значение i-го элемента первого массива.

В цикле перебираем элементы массива:

for (let i= 0; i < mas.length; i++) {
   a=?
    //console.log(a);
}

т.е. первый элемент обьект1, значит выводиться должно 16 и т.д.

Answer 1

let mas =["обьект1","Обьект2","Обьетк3","Обьект4"]; 
let mas1=[ 
    { 
        nameObj:'обьект4', 
        value: 14 
    }, 
    { 
        nameObj:'обьект1', 
        value: 16 
    }, 
    { 
        nameObj:'обьект2', 
        value: 17 
    } 
]; 
for (let i = 0; i < mas.length; i++) { 
  var a = mas1.find(item => item.nameObj == mas[i]); 
  console.log(a? a.value : "not found"); 
}

Answer 2

Цикл for для подобных целей менее удобен, чем метод find.

// решение (функция поиска в массиве объектов по значению св-ва) 
const findObjectByProp = (objArr, propName, propVal) => { 
  return objArr.find(o => o[propName] === propVal);  
};  
 
// использование 
const mas = ['объект1', 'объект2', 'объект3', 'объект4']; 
const mas1 = [ 
  { nameObj: 'объект4', value: 14 }, 
  { nameObj: 'объект1', value: 16 }, 
  { nameObj: 'объект2', value: 17 } 
]; 
let i = 1; 
const found = findObjectByProp(mas1, 'nameObj', mas[i]);  
if (found) 
  console.log(found.value); 


А если надо преобразовать массив значений одного свойства в массив значений другого, то это можно за 2 прохода (один проход на каждый входной массив) - вот так:

const mapToAnotherProp = (valArr, srcProp, objArr, dstProp) => { 
  const dict = objArr.reduce( 
    (rslt, obj) => rslt.set(obj[srcProp], obj[dstProp]) 
  , new Map());  
  return valArr.map(val => dict.get(val));  
};  
 
const mas = ['объект1', 'объект2', 'объект3', 'объект4']; 
const mas1 = [ 
  { nameObj: 'объект4', value: 14 }, 
  { nameObj: 'объект1', value: 16 }, 
  { nameObj: 'объект2', value: 17 } 
]; 
const result = mapToAnotherProp(mas, 'nameObj', mas1, 'value');  
console.log(result); 

READ ALSO
Google Таблицы. Не считает числа!

Google Таблицы. Не считает числа!

Ребята, доконает меня эта гугла)) Не хочет прибавлять число хоть ты тресниЯ пытаюсь из ячейки достать 45 и прибавить 4

179
Как отрендерить контент при клике?

Как отрендерить контент при клике?

Я вывожу массив с помощью mapПри двойном клике на элемент, я хочу, чтобы он добавился в массив и отренденился снизу списка

137
JavaScript. Проверка правильных ответов в тесте

JavaScript. Проверка правильных ответов в тесте

В общем идея такая, имеются имеются radiobutton'ы нужно нажать выбрать ответы во всех вопросах, по нажатию на кнопку должно проверяться правильные...

270