Получить формат полей в классе TypScript [duplicate]

$n = 7;

if ($n == 1) {
    echo 'Not a Prime or Composite No.';
}

$set = 0;
for ($index = 2; $index <= $n/2; $index++) {

    if ($n % $index === 0) {
        $set = 1;
        break;
    }
}

if ($set) {
    echo 'Composite';
} else {
    echo 'Prime';
}
1265
задан Script47 25 April 2018 в 13:20
поделиться

19 ответов

for (var key in validation_messages) {
    // skip loop if the property is from prototype
    if (!validation_messages.hasOwnProperty(key)) continue;

    var obj = validation_messages[key];
    for (var prop in obj) {
        // skip loop if the property is from prototype
        if(!obj.hasOwnProperty(prop)) continue;

        // your code
        alert(prop + " = " + obj[prop]);
    }
}
1806
ответ дан Mark Amery 15 August 2018 в 20:50
поделиться
  • 1
    Internet Explorer не согласен ( sigh ), говорит: «Объект не поддерживает это свойство или способ». когда вы делаете obj [prop]. Мне еще предстоит найти решение этого. – user999717 21 December 2011 в 14:02
  • 2
    Если вы используете jQuery, $ .each () / does / work в IE. – user999717 21 December 2011 в 15:16
  • 3
    @MildFuzz на самом деле имеет смысл, если вы считаете, что объекты JS не обязательно имеют числовые ключи. Вы не можете просто перебирать объект. JS for in очень похож на традиционный foreach. – Jake Wilson 28 February 2013 в 07:16
  • 4
    for ... in - хорошее решение, но если вы используете обещания в цикле for (), будьте осторожны, потому что, если вы создаете var в цикле, вы не сможете использовать его в функции then. Вы var в цикле существует только один раз, поэтому он имеет в каждой тогда-функции одно и то же, даже последнее значение. Если у вас есть эта проблема, попробуйте & quot; Object.keys (obj) .forEach & quot; или мой ответ ниже. – Biber 22 November 2016 в 22:15

Я знаю, что это поздно, но мне понадобилось 2 минуты, чтобы написать эту оптимизированную и улучшенную версию ответа AgileJon:

var key, obj, prop, owns = Object.prototype.hasOwnProperty;

for (key in validation_messages ) {

    if (owns.call(validation_messages, key)) {

        obj = validation_messages[key];

        for (prop in obj ) {

            // using obj.hasOwnProperty might cause you headache if there is
            // obj.hasOwnProperty = function(){return false;}
            // but owns will always work 
            if (owns.call(obj, prop)) {
                console.log(prop, "=", obj[prop]);
            }

        }

    }

}
29
ответ дан Azder 15 August 2018 в 20:50
поделиться
  • 1
    Почему вы сохраняете hasOwnProperty в owns, а затем вызываете owns.call(obj, prop) вместо того, чтобы просто вызвать obj.hasOwnProperty(prop) как , этот ответ делает? – Rory O'Kane 21 November 2012 в 07:25
  • 2
    Поскольку obj может иметь функцию hasOwnProperty, определенную на нем, поэтому она не будет использовать функцию из Object.prototype. Вы можете попробовать перед циклом for, подобным этому obj.hasOwnProperty = function(){return false;}, и он не будет перебирать какое-либо свойство. – Azder 21 November 2012 в 07:38
  • 3
    @Azder +1 для ответа и +1, если бы я мог для приятной вещи об Object.prototype.hasOwnProperty. Я видел это ранее в исходном коде библиотеки подчеркивания, но не знаю почему. – Samuel 3 January 2014 в 17:28

В соответствии с ECMAScript 5 вы можете комбинировать Object.keys() и Array.prototype.forEach():

var obj = {
  first: "John",
  last: "Doe"
};

//
//	Visit non-inherited enumerable keys
//
Object.keys(obj).forEach(function(key) {

  console.log(key, obj[key]);

});

570
ответ дан beaver 15 August 2018 в 20:50
поделиться
  • 1
    +1 для краткости кода, но, по-видимому, не работает столь же эффективно, как и для удивительно. JSPerf - для vs Object.keys – techiev2 4 September 2012 в 13:33
  • 2
    Опасайтесь этой ошибки, используя этот подход: & quot; TypeError: Object.keys, вызываемые на не-объекте & quot ;. Шаблон for ... in ... hasOwnProperty может быть вызван на что угодно, насколько я могу судить (объект, массив, нуль, неопределенный, истинный, ложный, числовой примитив, объекты). – theazureshadow 12 October 2012 в 03:17
  • 3
    Обратите внимание, что IE7 не поддерживает это. – Paul D. Waite 8 November 2013 в 13:02
  • 4
    @ techiev2 эти тесты никогда не были действительными. См. Мои обновленные для текущего состояния производительности: jsperf.com/objdir/20 – OrganicPanda 16 October 2014 в 11:39
  • 5
    @ techiev2: это не Object.keys(), что делает его медленным, это скорее forEach() и повторный доступ к .length! Если вместо этого вы используете классический for -loop, он почти в два раза быстрее, чем for..in + hasOwnProperty() в Firefox 33. – CoDEmanX 6 November 2014 в 00:50
for(var k in validation_messages) {
    var o = validation_messages[k];
    do_something_with(o.your_name);
    do_something_else_with(o.your_msg);
}
27
ответ дан chaos 15 August 2018 в 20:50
поделиться

Я не мог заставить вышеупомянутые записи делать то, что было после.

После того, как я играл с другими ответами, я сделал это.

Для этого объекта:

var myObj = {
    pageURL    : "BLAH",
    emailBox   : {model:"emailAddress", selector:"#emailAddress"},
    passwordBox: {model:"password"    , selector:"#password"}
};

... этот код:

// Get every value in the object into a separate array item ...
function buildArray(p_MainObj, p_Name) {
    var variableList = [];
    var thisVar = "";
    var thisYes = false;
    for (var key in p_MainObj) {
       thisVar = p_Name + "." + key;
       thisYes = false;
       if (p_MainObj.hasOwnProperty(key)) {
          var obj = p_MainObj[key];
          for (var prop in obj) {
            var myregex = /^[0-9]*$/;
            if (myregex.exec(prop) != prop) {
                thisYes = true;
                variableList.push({item:thisVar + "." + prop,value:obj[prop]});
            }
          }
          if ( ! thisYes )
            variableList.push({item:thisVar,value:obj});
       }
    }
    return variableList;
}

// Get the object items into a simple array ...
var objectItems = buildArray(myObj, "myObj");

// Now use them / test them etc... as you need to!
for (var x=0; x < objectItems.length; ++x) {
    console.log(objectItems[x].item + " = " + objectItems[x].value);
}

... производит это в консоль:

myObj.pageURL = BLAH
myObj.emailBox.model = emailAddress
myObj.emailBox.selector = #emailAddress
myObj.passwordBox.model = password
myObj.passwordBox.selector = #password
2
ответ дан CrazyMatt 15 August 2018 в 20:50
поделиться

Я думаю, что стоит отметить, что jQuery отлично сортирует это с помощью $.each().

См.: https://api.jquery.com/each/

Например:

$('.foo').each(function() {
    console.log($(this));
});

$(this) является единственным элементом внутри объекта. Примените swap $('.foo') к переменной, если вы не хотите использовать механизм выбора jQuery.

3
ответ дан Daniel Dewhurst 15 August 2018 в 20:50
поделиться
for(var key in validation_messages){
    for(var subkey in validation_messages[key]){
        //code here
        //subkey being value, key being 'yourname' / 'yourmsg'
    }
}
8
ответ дан Dmitri Farkov 15 August 2018 в 20:50
поделиться

Другая опция:

var testObj = {test: true, test1: false};
for(let x of Object.keys(testObj)){
    console.log(x);
}
4
ответ дан dude 15 August 2018 в 20:50
поделиться
  • 1
    Я попробовал ваше решение в Chrome 55.0, и вы получили ошибку типа. Ваш ответ выглядит красиво и лаконично, если вы можете заставить его работать, это, вероятно, будет одним из лучших вариантов. Я попытался это выяснить, но не понимаю твое решение. – TolMera 23 December 2016 в 14:38
  • 2
    @TolMera Исправлено. – dude 23 December 2016 в 15:05

Проблема с этим

for (var key in validation_messages) {
   var obj = validation_messages[key];
   for (var prop in obj) {
      alert(prop + " = " + obj[prop]);
   }
}

заключается в том, что вы также пропустите прототип примитивного объекта.

С помощью этого вы избежите этого:

for (var key in validation_messages) {
   if (validation_messages.hasOwnProperty(key)) {
      var obj = validation_messages[key];
      for (var prop in obj) {
         if (obj.hasOwnProperty(prop)) {
            alert(prop + " = " + obj[prop]);
         }
      }
   }
}
364
ответ дан hims056 15 August 2018 в 20:50
поделиться
  • 1
    Короче: проверьте hasOwnProperty внутри петель for - in. – Rory O'Kane 21 November 2012 в 07:11
  • 2
    Обратите внимание, что это необходимо только в том случае, если ваш метод HAS прототипа. Например, если объект, который вы просматриваете, является просто объектом JSON, вам не нужна эта проверка. – rednaw 29 December 2013 в 21:46
  • 3
    @rednaw Чтобы быть в безопасности, я использую эту проверку, потому что Object.prototype может быть изменен. Никакой нормальный сценарий не сделает этого, но вы не можете контролировать, какие скрипты могут быть запущены на вашей странице с помощью безумных расширений браузера. Расширения браузера запускаются на вашей странице (в большинстве браузеров), и они могут вызывать нечетные проблемы (например, установите для параметра window.setTimeout значение null!). – robocat 5 December 2014 в 03:42

Здесь представлена ​​улучшенная и рекурсивная версия решения AgileJon ( demo ):

function loopThrough(obj){
  for(var key in obj){
    // skip loop if the property is from prototype
    if(!obj.hasOwnProperty(key)) continue;

    if(typeof obj[key] !== 'object'){
      //your code
      console.log(key+" = "+obj[key]);
    } else {
      loopThrough(obj[key]);
    }
  }
}
loopThrough(validation_messages);

Это решение работает для всех видов разной глубины.

5
ответ дан JepZ 15 August 2018 в 20:50
поделиться

В ES7 вы можете сделать:

for (const [key, value] of Object.entries(obj)) {
  //
}
6
ответ дан Kévin Berthommier 15 August 2018 в 20:50
поделиться
  • 1
    Я сделал несколько тестов, этот метод очень медленный при работе с большим количеством данных. – vdegenne 24 September 2017 в 03:34

Если вы используете рекурсию, вы можете вернуть свойства объекта любой глубины -

function lookdeep(object){
    var collection= [], index= 0, next, item;
    for(item in object){
        if(object.hasOwnProperty(item)){
            next= object[item];
            if(typeof next== 'object' && next!= null){
                collection[index++]= item +
                ':{ '+ lookdeep(next).join(', ')+'}';
            }
            else collection[index++]= [item+':'+String(next)];
        }
    }
    return collection;
}

//example

var O={
    a:1, b:2, c:{
        c1:3, c2:4, c3:{
            t:true, f:false
        }
    },
    d:11
};
var lookdeepSample= 'O={'+ lookdeep(O).join(',\n')+'}';


/*  returned value: (String)
O={
    a:1, 
    b:2, 
    c:{
        c1:3, c2:4, c3:{
            t:true, f:false
        }
    },
    d:11
}

*/
52
ответ дан kennebec 15 August 2018 в 20:50
поделиться
  • 1
    Остерегайтесь циклов, таких как вызов этого на узле DOM. – theazureshadow 12 October 2012 в 03:35

Использование Underscore.js's _.each :

_.each(validation_messages, function(value, key){
    _.each(value, function(value, key){
        console.log(value);
    });
});
93
ответ дан Leo 15 August 2018 в 20:50
поделиться
  • 1
    Спасибо Тиму, используя знак подчеркивания, так что, безусловно, полезно иметь быстрый и чистый вариант. – The Coder 21 October 2012 в 23:18

В ES6 вы можете пропустить такой объект: (используя функцию стрелки )

Object.keys(myObj).forEach(key => {
    console.log(key);          // the name of the current key.
    console.log(myObj[key]);   // the value of the current key.
});

jsbin

В ES7 вы можете использовать Object.entries вместо Object.keys и пропустить такой объект:

Object.entries(myObj).forEach(([key, val]) => {
    console.log(key);          // the name of the current key.
    console.log(val);          // the value of the current key.
});

Вышеупомянутое также будет работать как однострочный:

Object.keys(myObj).forEach(key => console.log(key, myObj[key]));

jsbin

Если вы хотите также прокручивать вложенные объекты, вы можете использовать рекурсивную функцию (ES6):

const loopNestedObj = (obj) => {
  Object.keys(obj).forEach(key => {
    if (obj[key] && typeof obj[key] === 'object') loopNestedObj(obj[key]);  // recurse.
    else console.log(key, obj[key]);  // or do something with key and val.
  });
};

jsbin

То же, что и функция выше, но с ES7 Object.entries вместо Object.keys:

const loopNestedObj = (obj) => {
  Object.entries(obj).forEach(([key, val]) => {
    if (val && typeof val === 'object') loopNestedObj(val);  // recurse.
    else console.log(key, val);  // or do something with key and val.
  });
};

Если вы используете функциональное программирование , вы можете использовать Object.keys / Object.entries для перечисления объекта, затем обрабатывать значения, а затем использовать reduce() для преобразования обратно в новый объект.

const loopNestedObj = (obj) => 
  Object.keys(obj)
    // Use .filter(), .map(), etc. if you need.
    .reduce((newObj, key) => 
      (obj[key] && typeof obj[key] === 'object') ?
        {...newObj, [key]: loopNestedObj(obj[key])} :  // recurse.
        {...newObj, [key]: obj[key]},                  // Define value.
      {});
148
ответ дан Rotareti 15 August 2018 в 20:50
поделиться
  • 1
    для вашего ES7 с использованием примера Object.entries вам нужно обернуть параметры функции стрелки [ключ, val] в круглых скобках, например: `Object.entries (myObj) .forEach (([key, val]) = & gt; {/ * statements * /} – Puiu 2 March 2017 в 18:10
  • 2
    Я думаю, было бы полезно добавить тот факт, что Object.entries и Object.keys не перебирают прототип, что является большой разницей между ним и конструкцией for in. – steviejay 28 March 2017 в 19:06

В моем случае (на основе предыдущего) возможно любое количество уровней.

var myObj = {
    rrr: undefined,
    pageURL    : "BLAH",
    emailBox   : {model:"emailAddress", selector:"#emailAddress"},
    passwordBox: {model:"password"    , selector:"#password"},
    proba: {odin:{dva:"rr",trr:"tyuuu"}, od:{ff:5,ppa:{ooo:{lll:'lll'}},tyt:'12345'}}
};


function lookdeep(obj,p_Name,gg){
    var A=[], tem, wrem=[], dd=gg?wrem:A;
    for(var p in obj){
        var y1=gg?'':p_Name, y1=y1 + '.' + p;
        if(obj.hasOwnProperty(p)){
           var tem=obj[p];
           if(tem && typeof tem=='object'){
               a1=arguments.callee(tem,p_Name,true);
               if(a1 && typeof a1=='object'){for(i in a1){dd.push(y1 + a1[i])};}
            }
            else{
               dd.push(y1 + ':' + String(tem));
            }
        }
    };
    return dd
};


var s=lookdeep(myObj,'myObj',false);
for (var x=0; x < s.length; ++x) {
console.log(s[x]+'\n');}

результат:

["myObj.rrr:undefined",
"myObj.pageURL:BLAH",
"myObj.emailBox.model:emailAddress",
"myObj.emailBox.selector:#emailAddress",
"myObj.passwordBox.model:password",
"myObj.passwordBox.selector:#password",
"myObj.proba.odin.dva:rr",
"myObj.proba.odin.trr:tyuuu",
"myObj.proba.od.ff:5",
"myObj.proba.od.ppa.ooo.lll:lll",
"myObj.proba.od.tyt:12345"]
-6
ответ дан user2515312 15 August 2018 в 20:50
поделиться

ECMAScript-2017, только что завершившийся месяц назад, представляет Object.values ​​(). Итак, теперь вы можете сделать это:

let v;
for (v of Object.values(validation_messages))
   console.log(v.your_name);   // jimmy billy
18
ответ дан vdegenne 15 August 2018 в 20:50
поделиться

p - значение

for (var key in p) {
  alert(key + ' => ' + p[key]);
}

ИЛИ

Object.keys(p).forEach(key => { console.log(key, p[key]) })
3
ответ дан Wesam 15 August 2018 в 20:50
поделиться
0
ответ дан Jorge Santos Neill 5 September 2018 в 20:17
поделиться
22
ответ дан vdegenne 5 September 2018 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: