Не удаляются элементы объекта

157
13 января 2018, 02:53

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'))

Должно получиться вот так , но в итоге выводится массив с пустым объектом. В чем может быть проблема? Использование аргументов является обязательным условием.

Answer 1

Проблема в том, что каждый из аргументов сравнивается со всеми ключами объекта. И если хотя бы с одним из ключей аргумент не совпадает (а так оно и будет), то ключ удаляется из объекта.

Нужно проходить по ключам объекта и проверять, есть ли такой ключ среди аргументов:

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);

Answer 2

Я просто оставлю это здесь

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'));

Answer 3

Первым циклом в пробегаете по аргументам, а вторым по полям объекта и сравниваете поле объекта с текущим аргументом. На первой итерации Вы удаляете из объекта все поля, кроме 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'));

Answer 4

Тоже положу, а то вы как-то очень сложно ее решаете

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'))

READ ALSO
Передача файла в форме ajax

Передача файла в форме ajax

Есть два отчетаВ первом форма содержит текстовые значения

152
сравнение с регулярным выражением

сравнение с регулярным выражением

Скрипт получает переменную и сравнивает ее со значением, и при равенстве выполняет код else if(result === 'Сколько времени'){

129
Minecraft Server Hash ID [требует правки]

Minecraft Server Hash ID [требует правки]

Как можно получить хэш сервера Minecraft? Почитал здесь (Server ID String), но ничего не понялПишу на PHP

232
Как получить уведомление о платеже от Яндекс.Касса?

Как получить уведомление о платеже от Яндекс.Касса?

Всем приветПервый раз связался с Яндекс

262