Задать вопрос
@Anton8989

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

Нужно написать функцию, которая бы в себя принимала два аргумента (объект и массив):

let a = {
  photo: 'фото',
  video: 'видео',
  img: 'рисунок'
}

let b = ['фото','видео']

сравнивала бы значения объекта со значениями массива (фото = фото) и возвращала новый объект, в котором были бы только совпавшие свойства, т.е:

let result = {
  photo: 'фото',
  video: 'видео'
}
  • Вопрос задан
  • 133 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const filterObject = (obj, values) =>
  Object.entries(obj).reduce((acc, [ k, v ]) => (
    values.indexOf(v) !== -1 && (acc[k] = v),
    acc
  ), {});


const result = filterObject(a, b);

или

const filterObject = (obj, filter) =>
  Object.fromEntries(Object.entries(obj).filter(n => filter(...n)));


const result = filterObject(a, (k, v) => b.includes(v));
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Нужно инвертировать (преобразовать) массив в ассоциативный массив, дальше всё просто:
var a = {
	photo: 'фото',
	video: 'видео',
	img: 'рисунок'
};

var b = ['фото','видео'];

function my_filter(obj, arr) {
	let assoc = {}; //Ассоциативный массив, чтобы проверка была быстрой.
	arr.forEach(e=>assoc[e]=1);
	let result = {};
	for (let prop in obj) {
		if (assoc[obj[prop]]) result[prop] = obj[prop];
	}
	return result;
}

var filtered = my_filter(a, b);

Если есть возможность формировать массив b изначально, как ассоциативный (то есть в виде объекта), то лучше так делать, чтобы скрипт быстрее работал на больших данных.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽