var arr = [{name: 'Вася', age: '21', gender: 'male'}];
function fun () {
var newArr = arr;
for (var i = 0; i < arguments.length; i++) {
for (var key in newArr[0]) {
if (key !== arguments[i]) {
delete newArr[0][key]
}
}
}
return newArr
}
console.log(fun('name', 'age'))
Должно получиться вот так , но в итоге выводится массив с пустым объектом. В чем может быть проблема? Использование аргументов является обязательным условием.
Проблема в том, что каждый из аргументов сравнивается со всеми ключами объекта. И если хотя бы с одним из ключей аргумент не совпадает (а так оно и будет), то ключ удаляется из объекта.
Нужно проходить по ключам объекта и проверять, есть ли такой ключ среди аргументов:
var arr = [{
name: 'Вася',
age: '21',
gender: 'male'
}];
function fun() {
for (var key in arr[0]) {
if (Array.prototype.indexOf.call(arguments, key) == -1) {
delete arr[0][key];
}
}
return arr;
}
console.log(fun('name', 'age'));
Так как меняется объект, являющийся первым элементом массив, то newArr
я из кода убрал. Если нужно в итоге получать копию массива с копиями объектов, то можно это сделать как-то так:
var arr = [{
name: 'Вася',
age: '21',
gender: 'male'
}];
function fun() {
var newArr = arr.slice();
for (var i = 0; i < newArr.length; i++)
newArr[i] = Object.assign({}, newArr[i]);
for (var key in newArr[0]) {
if (Array.prototype.indexOf.call(arguments, key) == -1) {
delete newArr[0][key];
}
}
return newArr;
}
console.log(fun('name', 'age'));
console.log(arr);
Я просто оставлю это здесь
const arr = [{name: 'Вася', age: '21', gender: 'male'}];
const fun = (...filter_params) => arr.map(obj =>
Object.keys(obj).filter(key => filter_params.includes(key))
.reduce((result, key) => (result[key] = obj[key], result), {})
);
console.log(fun('name', 'age'));
Первым циклом в пробегаете по аргументам, а вторым по полям объекта и сравниваете поле объекта с текущим аргументом. На первой итерации Вы удаляете из объекта все поля, кроме name
(имя первого аргумента). На второй итерации удаляете из объекта все поля, кроме age
(имя второго аргумента). Т.к. после первой итерации в объекте осталось одно поле, то на выходе Вы получаете пустой объект
Гораздо эффективнее и проще будет не удалять поля из существующего объекта, а конструировать новый
var arr = [{name: 'Вася', age: '21', gender: 'male'}];
function fun() {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
var newObj = {};
for (var j = 0; j < arguments.length; j++) {
var fld = arguments[j];
if (fld in obj) // Проверяем есть ли у объекта такое поле
newObj[fld] = obj[fld];
}
newArr.push(newObj);
}
return newArr;
}
console.log(fun('name', 'age'));
Тоже положу, а то вы как-то очень сложно ее решаете
var arr = {name: 'Вася', age: '21', gender: 'male'}
function getByKeys() {
var newArr = {}
for(var x in arguments)
if(arguments[x] in this)
newArr[arguments[x]] = this[arguments[x]]
return newArr
}
Object.defineProperty(Object.prototype, 'getByKeys', { value: getByKeys, enumerable: false })
console.log(arr.getByKeys('name', 'age'))
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Скрипт получает переменную и сравнивает ее со значением, и при равенстве выполняет код else if(result === 'Сколько времени'){
Как можно получить хэш сервера Minecraft? Почитал здесь (Server ID String), но ничего не понялПишу на PHP