Javascript повторил внутренние значения массива / объекта с тем же ключом

#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:

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться некоторым примером кода в контексте моего вопроса