Постановка задачи : У меня есть объект JSON, содержащий количество свойств n внутри него. Мне нужно передать некоторые свойства из этого объекта JSON в виде строки JSON на сервер.
Пытался : Я использовал метод Object.defineProperty (), чтобы сделать enumerable как false свойств объекта, которые я не хочу передавать в моем JSON string. Пожалуйста, найдите ниже фрагмент кода, чтобы получить более четкое представление.
var jsonObj = {
"name": "Rohit",
"age": 27,
"city": "Gurgaon"
};
Object.defineProperty(jsonObj, 'name', {
enumerable: false
});
console.info(JSON.stringify(jsonObj));Проблема с приведенным выше кодом:
Предположим, у меня есть количество свойств 100 в объекте, и я хочу передать серверу только свойства 20 из 100. Затем мне нужно написать ниже строку кода 80 раз, чтобы удалить нежелательные свойства, и это повлияет на производительность приложения.
Object.defineProperty(jsonObj, 'name', { enumerable: false });
Я также рассмотрел уже заданные вопросы по SO, но не нашел подходящего ответа на эту постановку проблемы.
Есть ли лучший способ добиться этого?
Вы сравнивали, не было бы быстрее отправить весь объект на сервер?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


var jsonObj = {
"name": "Rohit",
"age": 27,
"city": "Gurgaon"
};
var newObj = jsonObj;
var arr = ["name","age"];
for(var i=0;i<arr.length;i++){
delete newObj[arr[i]]
}
console.info(newObj);Думаю, это может решить вашу проблему.
Попробуйте следующее, это не изменит ваш исходный объект:
var jsonObj = {
"name": "Rohit",
"age": 27,
"city": "Gurgaon"
};
var storePropeties = ["city"];
var result = Object.keys(jsonObj).reduce(function (obj, key) {
if (storePropeties.includes(key))
obj[key] = jsonObj[key];
return obj
}, {})
console.info(result);Всегда есть возможность создать новый объект и вытащить только нужные вам ключи. См. Однострочный, чтобы взять некоторые свойства из объекта в ES 6 для этого.
JSON.stringify принимает функцию «заменитель» в качестве второго аргумента. Это позволяет вам изменять значения во время сериализации, включая их фильтрацию. Предполагая, что вы хотите сохранить меньше свойств, вы должны перечислить их в массиве или Set.
var jsonObj = {
"name": "Rohit",
"age": 27,
"city": "Gurgaon"
};
var toKeep = ['age', 'city'];
console.info(JSON.stringify(
jsonObj,
(key, value) => !key || toKeep.indexOf(key) > -1 ? value : undefined,
));Вы должны создать новый объект, который хотите отправить на сервер.
Мое решение:
var jsonObj = {
"name": "Rohit",
"age": 27,
"city": "Gurgaon"
};
// if you don't need specific keys you should delete this and ~keys.indexOf(prop) in condition
var keys = ['name', 'city', 'moscow'];
function newObj(obj, count) {
var newObj = {};
var counter = count;
for (var prop in obj) {
if (jsonObj.hasOwnProperty(prop) && ~keys.indexOf(prop)) {
newObj[prop] = obj[prop];
counter -= 1;
}
if (counter === 0) break;
}
return newObj;
}
console.info(JSON.stringify(newObj(jsonObj, 20)));
for...in может перебирать свойства в произвольном порядке, поэтому будет выбрано 20 случайных свойств?
@FelixKling, я не понимаю твой вопрос
Думаю, мне следует превратить это в утверждение: это решение выберет 20 произвольных свойств, что, похоже, не то, что хочет OP.
@FelixKling, а теперь? Я поменял код :) тебе нравится?
Как вы решаете, какие свойства отправлять на сервер? У вас есть массив названий свойств?