#javascript
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')) Должно получиться вот так , но в итоге выводится массив с пустым объектом. В чем может быть проблема? Использование аргументов является обязательным условием.
Ответы
Ответ 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);Ответ 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'));Ответ 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'));Ответ 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'))
Комментариев нет:
Отправить комментарий