2016-04-29 4 views
0

Я создаю функцию, которая использует цикл for-in для прохождения любого объекта, изменения его значений (будь то число, строка или логическое значение) в одну конкретную строку, а затем вывести ее. Я прошел через кучу существующих вопросов, которые помогли мне получить общее представление о петлях for-in. Я пытался выяснить, как заставить функцию внести изменения, а затем вернуть новые значения. Вот что у меня есть до сих пор:Использование функции для сквозного цикла через объект для изменения значений, а затем возвращает результат

var switcharoo = function(whateverObject){ 
    for (var i in whateverObject){ 
    if (whateverObject.hasOwnProperty(i)){ 
    alert(i + "redacted" + whateverObject[i]); 
    } 
    } 
return whateverObject; 
};  

Я понимаю рамки, которые я настроил для этой функции. Я понимаю структуру цикла for-in. Я также понимаю важность части hasOwnProperty. Теперь я потерян ...

alert(i + "this is a string" + whateverObject[i]); 

line, я не могу окутать голову. Я получил это от вопроса здесь, на StackOverflow. Возвращаемая строка anyObject - это всего лишь мое лучшее усилие для вывода результата. Итак, как мне запустить объект и изменить все значения на определенную строку?

Вопрос с бонусом: как бы настроить эту функцию для поиска истинных/ложных значений и удалить только ложные?

+2

Вы не назначаем любую строку к любому из свойств объекта. Кроме того, я бы предложил использовать Object.keys() для простоты. – Redu

ответ

0

Проблема в том, ... вы ничего не меняется вообще: D

alert просто отображает значение, но ничего не делает.

var switcharoo = function(whateverObject){ 
    for (var i in whateverObject){ 
    if (whateverObject.hasOwnProperty(i)){ 
     alert(i + "redacted" + whateverObject[i]); 

     // Assign value to this key in whateverObject 
     whateverObject[i] = 'redacted'; 

    } 
    } 
    return whateverObject; 
}; 

Как бы настроить эту функцию для поиска истинных/ложных ценностей и удалить только ложные?

Теперь для некоторых современных JavaScript. Вы можете использовать Object.keys, чтобы получить массив ключей объекта. Используйте этот массив для прокрутки всех ключей в объекте. Затем вы можете использовать reduce для создания объекта только с ключами, которые не имеют значений false.

function switcharoo(object){ 
    return Object.keys(object).reduce(function(allTrue, key){ 
    if(object[key] !== false) allTrue[key] = object[key]; 
    return allTrue; 
    }, {}); 
} 
+0

, поэтому вы используете сокращение, чтобы сгребать все ключи объектов, используя любые условия, которые вы создаете (allTrue, в данном случае), и работаете только с тем, что соответствует этим требованиям? – Kyle

+0

@Kyle 'reduce' подобен' forEach', за исключением того, что вы получаете возвращаемое значение предыдущей итерации. В этом случае он используется для переноса начального значения '{}' как 'allTrue', добавляя каждую пару не-ложных ключей-значений на этом пути. Возвращение последней итерации становится возвратом 'reduce'. – Joseph

+0

Понял, я до сих пор привык к идее, что вы можете объявить новую переменную (т. Е. AllTrue) в середине блока кода. Если ключ не имеет значения, то он ложный? Я получаю сообщение об ошибке, потому что один из ключей не имеет значения и включен в мой вывод, когда он не должен ... – Kyle

0

Другой подход

var switcharoo = (o,s) => Object.keys(o).reduce((p,k) => {p[k] = s; return p},{}), 
 
     myObj = {a: 1, 
 
        b: _ => console.log(this.a), 
 
        c: {x: 3, 
 
         y: "hi there", 
 
         z: [1,2,3] 
 
        } 
 
       }; 
 
document.write("<pre>" + JSON.stringify(switcharoo(myObj, "stractassineboom"), null, 2) + "</pre>");

 Смежные вопросы

  • Нет связанных вопросов^_^