@Anton8989

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

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

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

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

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

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

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

Похожие вопросы