有没有更简单的方法来检查属性的存在?

时间:2016-07-12 09:24:04

标签: javascript

我有一个对象例如:

var extra = {
  field1: {
    foo: {},
    bar: {}
  }
}

field1无法保证设置,如果我需要检查是否存在extra.field1.foo,我必须使用:

if(typeof extra.field1 != 'undefined') {
    if(typeof extra.field1.foo != 'undefined') {
        ....
    }
}

有没有更简单的方法来进行检查?

7 个答案:

答案 0 :(得分:4)

您可以使用in运算符。

  

如果指定的属性位于指定的对象中, in 运算符将返回true

if ('field1' in extra && 'foo' in extra.field1) {
    // true for foo
}

答案 1 :(得分:3)

您可以使用Object.prototype.hasOwnProperty()以及in operator。但为简单起见,您可以检查是否存在这样的属性:

if (extra.field1 && extra.field1.foo ) {
    // ...
}

答案 2 :(得分:1)

你可以创建一个接受数组(或字符串)并检查其中每个元素的函数,然后你可以检查代码中只有一个条件的每个嵌套属性的存在。

<table id="example1" class="table table-bordered table-striped">
                    <thead>
                      <tr>
                        <th>Id</th>
                        <th>Job Id</th>
                        <th>Job Name</th>
                        <th>Company Name</th>
                        <th>Company Id</th>
                        <th>More</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr>
                      <?php
                        foreach ($result as $object) 
                        {
                      ?>
                        <td><?php echo $object['id']?></td>
                        <td><?php echo $object['job_id']?></td>
                        <td><?php echo $object['job_name']?></td>
                        <td><?php echo $object['company']?></td>
                        <td><?php echo $object['cid']?></td>
                        <td>
                          <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#MyModal_<?php echo $object['id']?>">
                            Details
                          </button>
                        </td>
                          </tr>
                          <div id="MyModal_<?php echo $object['id']?>" class="modal fade" role="dialog">
                            <div class="modal-dialog">
                              <div class="modal-content">
                                <div class="modal-header">
                                  <button type="button" class="close" data-dismiss="modal">&times;</button>
                                  <div class="modal-title"><h3>Company Name :<?php echo $object['company']?></h3></div>
                                </div>
                                <div class="modal-body">
                                  <h3>Id:           <?php echo $object['id']?></h3>
                                  <h3>Job Name:     <?php echo $object['job_name']?></h3>
                                  <h3>Job Id:       <?php echo $object['job_id']?></h3>
                                  <h3>Paper Size:   <?php echo $object['paper_size']?></h3>
                                  <h3>Paper Type:   <?php echo $object['paper_type']?></h3>
                                  <h3>Cutting Size: <?php echo $object['cutting_size']?></h3>
                                  <h3>Sheet:        <?php echo $object['sheet']?></h3>
                                  <h3>Lamination:   <?php echo $object['lamination']?></h3>
                                  <h3>Print Type:   <?php echo $object['print_type']?></h3>
                                  <h3>Ctp By:       <?php echo $object['ctp_by']?></h3>

                                </div>
                                <div class="modal-footer">
                                <form method="post" action="admin_view">
                                  <button type="button" name="accepted" value="accept" class="btn btn-success">Accept Job</button>
                                </form>
                                  <button type="button" class="btn btn-danger" data-dismiss="modal">Reject Job</button>
                                  <button type="button" class="btn btn-default" data-dismiss="modal">close</button>
                                </div>
                                <?php } ?>
                              </div>
                            </div>
                          </div>
                        </td>

                    </tbody>

                  </table>


   Try this code. i thing. you problem will resolved.

答案 3 :(得分:0)

您始终必须检查这两个字段,但您可以用不同的方式编写它们。如果您确定要检查对象,那么以下代码就足够安全了:

if (extra.field1) { //if field1 is not null / undefined / zero / empty string / false
  if (extra.field.foo) {...}
  ...
}

如果field1可以是0或空字符串,那将是不安全的,因为两者都是“虚假”值

答案 4 :(得分:0)

使用Object的hasOwnProperty(prop)执行此任务。

if (extra.hasOwnProperty('field1') && extra.field1.hasOwnProperty('foo')) {
    // ...
}

答案 5 :(得分:0)

如果您只想知道对象是否具有特定属性,无论原型链中的哪个位置,您都可以使用in运算符:

if (myprop in myobj) {
    ...
}

考虑他的方法将检查您的对象具有的所有属性和方法以及它从&#39;语言获得的方法。 举个例子:

var o = {
    "myprop": true
};

if ("toString" in o) {
    console.log('toString exists');
}

打印出&#39; toString存在&#39;。

如果您对在对象内部进行检查感兴趣,则必须使用:

if (Object.hasOwnProperty.call(myobject, myprop)) {
    ...
}

这可以避免使用toStringhasOwnProperty这样的继承方法。

肮脏的方式是使用!!方法:

if (!!myobject[myprop]) {
    ....
}

这样就强制将任何myobject[myprop]转换为布尔值。 这个问题,就是你可以有可以转换为false的值,比如空字符串或null或undefined,或者当然是布尔值假!

答案 6 :(得分:0)

此方法可以无限制地检查任何深度。

function exists(node, chainString) {
  return chainString.split('.')
    .every(prop => node && prop in node ? (node = node[prop]) || true : false);
}

nodes = [
  {x: { y: { z: 43 }}},
  {x: { y: { z: undefined }}},
  {x: { y: null }},
  {x: []},
];

console.log(nodes.map(n => exists(n, "x.y.z")));