#javascript #clone #helper
#javascript #клонирование #помощник
Вопрос:
У меня может быть другая версия объекта:
myObject1 = {
color: 'red',
size : 'big',
name : 'Beautiful red',
count: 2
};
myObject2 = {
color: 'blue',
name : 'Awesome blue',
count : null
};
Мне нужен помощник, чтобы сохранить только то значение, которое я хочу и которое существует :
function myHelper() {
?????
}
myHelper(myObject1, ['color','size','count']) // => { color: 'red', size : 'big', count:2}
myHelper(myObject2, ['color','size','count']) // => { color: 'blue'}
Кто-нибудь уже создал его?
Ответ №1:
Преобразуйте объект в записи и фильтруйте по:
- Свойство объекта (
key
) существует в нужном списке ключей (props
) - Value (
val
) неnull
является .
const myObject1 = {
color: 'red',
size : 'big',
name : 'Beautiful red',
count: 2
};
const myObject2 = {
color: 'blue',
name : 'Awesome blue',
count : null
};
function myHelper(obj, props) {
return Object.fromEntries(Object.entries(obj)
.filter(([key, val]) => props.includes(key) amp;amp; val != null));
}
console.log(myHelper(myObject1, ['color','size','count']));
console.log(myHelper(myObject2, ['color','size','count']));
.as-console-wrapper { top: 0; max-height: 100% !important; }
Если вы хотите оптимизировать это, вы можете изменить проверку «array includes» на «set has» через:
const myHelper = (obj, props) => (pSet => Object.fromEntries(Object.entries(obj)
.filter(([key, val]) => pSet.has(key) amp;amp; val != null)))
(new Set(props));
Комментарии:
1. Короче:
const myHelper = (obj, props) => Object.fromEntries(Object.entries(obj) .filter(([key, val]) => props.includes(key) amp;amp; val != null));
Ответ №2:
Используя Array.reduce
, мы можем добиться этого
let myObject1 = {
color: 'red',
size : 'big',
name : 'Beautiful red',
count: 2
};
let myObject2 = {
color: 'blue',
name : 'Awesome blue',
count : null
};
const myHelper = (data, keys) => keys.reduce((res, key) => {
//check if the data is available in the provided object for the given key, if so add it to the result object.
if (data[key]) {
res[key] = data[key]
};
return res;
}, {})
console.log(myHelper(myObject1, ['color', 'size', 'count']))
console.log(myHelper(myObject2, ['color', 'size', 'count']))
.as-console-wrapper {
max-height: 100% !important;
}
Ответ №3:
Это можно просто сделать с помощью Array.reduce
ключей for .
myObject1 = {
color: 'red',
size : 'big',
name : 'Beautiful red',
count: 2
};
myObject2 = {
color: 'blue',
name : 'Awesome blue',
count : null
};
function myHelper(input, keys) {
const result = keys.reduce((acc, cur) => {
if (input[cur]) {
acc[cur] = input[cur];
}
return acc;
}, {});
return resu<
}
console.log(myHelper(myObject1, ['color','size','count'])); // => { color: 'red', size : 'big', count:2}
console.log(myHelper(myObject2, ['color','size','count'])); // => { color: 'blue'}
Ответ №4:
Проверьте совместимость с браузером, прежде чем использовать Object.fromEntries
here
Вы можете сделать это, используя Object.entries
для перебора записей объекта ( [key, value]
пар) и filter
ключа k
объекта, если он есть в предоставленном массиве (используется Set
для более быстрого поиска), и значения v
, которых нет null
.
Затем передайте этот массив записей в Object.fromEntries
и получите его как объект:
myObject1 = {
color: 'red',
size: 'big',
name: 'Beautiful red',
count: 2
};
myObject2 = {
color: 'blue',
name: 'Awesome blue',
count: null
};
function myHelper(obj, arr) {
return Object.fromEntries(
Object.entries(obj)
.filter(([k, v]) => new Set(arr).has(k) amp;amp; v !== null)
);
}
console.log(myHelper(myObject1, ['color', 'size', 'count']))
console.log(myHelper(myObject2, ['color', 'size', 'count']))
Другим вариантом было бы перебирать заданные ключи в arr
и filter
те, которые присутствуют в данном obj
и не null
являются .
Затем map
в массив [key, value]
пар и укажите это в качестве аргумента Object.fromEntries
для вывода в виде объекта:
myObject1 = {
color: 'red',
size: 'big',
name: 'Beautiful red',
count: 2
};
myObject2 = {
color: 'blue',
name: 'Awesome blue',
count: null
};
function myHelper(obj, arr) {
return Object.fromEntries(
arr.filter(k => obj[k]).map(k => [k, obj[k]])
);
}
console.log(myHelper(myObject1, ['color', 'size', 'count']))
console.log(myHelper(myObject2, ['color', 'size', 'count']))
Ответ №5:
Вы можете .map()
переопределить свой массив ключей и создать новый объект на основе вашего массива ключей. Чтобы создать новый объект из массива, вы можете сопоставить ключи с объектами. Затем вы можете объединить этот массив объектов в один объект, используя Object.assign()
:
const myObject1 = { color: 'red', size : 'big', name : 'Beautiful red', count: 2 };
const myObject2 = { color: 'blue', name : 'Awesome blue', count : null };
function myHelper(obj, arr) {
return Object.assign(
{}, ...arr.map(k => obj[k] != undefined ? {[k]: obj[k]} : {})
);
}
console.log(myHelper(myObject1, ['color','size','count'])); // => { color: 'red', size : 'big', count:2}
console.log(myHelper(myObject2, ['color','size','count'])); // => { color: 'blue'}
Создавая объект из ключей (вместо того, чтобы отфильтровывать ваш входной объект), вы избавляете от необходимости проверять, находится ли текущая запись в вашем массиве ключей.
Ответ №6:
Некоторые из опубликованных здесь ответов явно не проверяются undefined
и null
, следовательно, если значение свойства является пустой строкой ""
, или 0
они также будут отфильтрованы, что, я предполагаю, не то, что вы хотите.
Вы можете использовать .getOwnPropertyNames
и .reduce
для фильтрации нужных вам свойств.
function keep(obj = {}, props = []) {
return Object.getOwnPropertyNames(obj).reduce((acc, prop) => {
if (obj[prop] !== undefined amp;amp; obj[prop] !== null amp;amp; props.includes(prop)) {
return { ...acc, [prop]: obj[prop] };
}
return acc;
}, {});
}
const cleanedObj = keep({ color: undefined, size: null, count: 0, age: 20 }, [
"color",
"size",
"count",
"age",
]);
console.log(cleanedObj); // { count: 0, age: 20 }
Ответ №7:
function myHelper (sourceObj, [...keys]) {
let objSubset = Object.entries(sourceObj)
.filter(([key]) => keys.includes(key))
.filter(([, value]) => value !== undefined amp;amp; value !== null)
.reduce((newObj, [key, val]) => Object.assign(newObj, { [key]: val }), {});
return objSubset
}
myObject1 = {
color: 'red',
size : 'big',
name : 'Beautiful red',
count: 2
};
myObject2 = {
color: 'blue',
name : 'Awesome blue',
count : null
};
let x = myHelper(myObject1, ['color','size','count']);
let y = myHelper(myObject2, ['color','size','count']);
console.log(x)
console.log(y)
Функция не будет возвращать объект со значениями, которые являются неопределенными и нулевыми, но все равно вернет объект с 0
пустой строкой ""
и Boolean
значениями.