@Anton8989

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

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

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

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

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

let result = {
  photo: 'фото',
  video: 'видео'
}
  • Вопрос задан
  • 123 просмотра
Решения вопроса 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 изначально, как ассоциативный (то есть в виде объекта), то лучше так делать, чтобы скрипт быстрее работал на больших данных.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы