#javascript #node.js
#javascript #node.js
Вопрос:
Я создаю приложение nodejs, и у него очень много клиентов с разными часовыми поясами. Я сохраняю все данные в метке времени Unix, когда клиент входит в систему, я использую часовой пояс клиентов для добавления или вычитания к метке времени unix, хранящейся в базе данных, чтобы она соответствовала времени клиентов.
Пользовательские данные (документ / объект) также имеют ключи с массивами и другими объектами,
{
name: "data",
location": "us",
activity: [],
time: 1476301165252,
subdoc: [{
time: 1476301165252,
someotherKeys: ....
}]
}
Как я могу просмотреть этот документ и отредактировать все «временные» ключи (включая внутренние объекты и массивы) и добавить или вычесть число ко всем «временным» ключам соответственно.
Число будет одинаковым. это означает, что все «временные» ключи будут повторяться с тем же номером.
Ответ №1:
Я думаю, вы захотите использовать рекурсивный for...in
цикл для решения этой проблемы.
Что-то вроде этого:
function changeTime (inputObj, newTimeVal) {
var key;
for (key in inputObj) {
if (key === "time") {
inputObj[key] = newTimeVal;
}
if (typeof inputObj[key] === 'object') {
changeTime(inputObj[key], newTimeVal);
}
}
}
Может быть, это не совсем правильно, но это должно привести вас на правильный путь.
редактировать: если вы хотите только добавить или вычесть из исходного значения, достаточно просто использовать этот же шаблон:
function changeTime (inputObj, delta) { // we'll always add here-- you can pass in a negative or positive number to account for add or subtract
var key;
for (key in inputObj) {
if (key === "time") {
inputObj[key] = inputObj[key] delta;
}
if (typeof inputObj[key] === 'object') {
changeTime(inputObj[key], delta);
}
}
}
Комментарии:
1. Я только хочу добавить или вычесть из текущего значения,
2. Объекты в JS передаются по ссылке — вы редактируете тот же объект, который вы передали.
3. Проверьте этот пример данных jsfiddle.net/grnxex31 . Ваш метод выводит только отредактированные ключи, можете ли вы заставить свой метод возвращать тот же объект вместе с измененными ключами.
4. @Tuna — я думаю, вы неправильно понимаете, что происходит. Когда вы передаете объект или массив в метод, метод не редактирует копию, как примитив, — он редактирует тот же объект, который вы передали . Мой метод ничего не возвращает, потому что он редактирует объект, который вы передали напрямую — вот как объекты передаются в JS. Попробуйте записать в консоль значение
userData
перед передачей его в метод, а затем записать его значение после его передачи — я думаю, вы увидите, чтоuserData
оно было обновлено / преобразовано после завершения моей функции.5. Пожалуйста, смотрите Этот раздел ссылки MDN на функции для получения подробной информации — в нем четко указано: «… ссылки на объекты тоже являются значениями, и они особенные: если функция изменяет свойства ссылочного объекта, это изменение видно за пределами функции …»
Ответ №2:
Вы могли бы сделать что-то вроде этого:
var obj = {
name: "data",
location: "us",
activity: [],
time: 1476301165252,
subdoc: [{
time: 1476301165252,
}]
};
function iterate(obj) {
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
iterate(obj[property], property);
} else {
if (property === 'time') {
console.log(property " " obj[property]);
}
}
}
}
}
iterate(obj)
https: //jsfiddle.net/uxqgd8cf/
Комментарии:
1. Ваш метод выводит только отредактированные ключи «time», можете ли вы заставить этот метод возвращать тот же объект вместе с отредактированными ключами.
2. если (property === ‘time’) { console.log(property » » obj[property]); } , внутри этого вы можете отредактировать время … которое обновит исходный объект…
3. Да, это работает, посмотрите на реальный пример с моими пользовательскими данными, он не возвращает весь объект jsfiddle.net/1gmx3kk0
4. ваш объект модифицируется … проверьте это… посмотрите, где я разместил свою консоль. оператор журнала и внутри моего блока if я обновляю значение свойства… jsfiddle.net/1gmx3kk0/1
Ответ №3:
Вы должны использовать for в цикле для создания объектов цикла в Javascript https://www.google.com.tr/url?sa=tamp;source=webamp;rct=jamp;url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…inamp;ved=0ahUKEwiJ7q6WhtbPAhUkAsAKHXehDAkQFggaMAAamp;usg=AFQjCNGzYTP9ERuhLVoFVYR52HohZmZ0eQamp;sig2=N_sNA5ZjKyeVmCjEisDNDQ
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться некоторым примером кода в контексте моего вопроса