将字符串与JavaScript对象中的键进行比较

Hus*_*lue 2 javascript

如何将字符串与JavaScript对象的键进行比较?例如,这是一个字符串和一个JavaScript对象.我想比较字符串(在这种情况下,myString的值是"Item1")与此JavaScript对象中的键(在这种情况下,键是Item1和Item2):

var myString = "Item1";

var jsObject = 
{
    Item1:
    {
        "apples": "red",
        "oranges": "orange",
    },
    Item2:
    {
        "bananas": "yellow",
        "pears": "green"
    }
};
Run Code Online (Sandbox Code Playgroud)

如果我创建一个'for'循环并通过循环运行对象的内容,我想将此对象中的键与字符串进行比较.

for (var x = 0; x < Object.keys(jsObject).length; x++)
{
    if (myString == /* What do I put here to compare to grab Item1 or Item2? */)
    {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ary 9

你不需要一个循环,不应该使用它.而是直接引用object属性.这更简单,更快捷:

var myString = "Item1";

var jsObject = {
    Item1: {
        "apples": "red",
        "oranges": "orange",
    },
    Item2: {
        "bananas": "yellow",
        "pears": "green"
    }
};

var item;
if( jsObject.hasOwnProperty(myString) ) {
    item = jsObject[myString];
    console.log( item );
}
Run Code Online (Sandbox Code Playgroud)

另外,如果你不介意,我会有一个风格推荐.您可能会注意到,在上面的代码片段中,我将打开的花括号移动到上面一行的末尾而不是它们自己的行.

在大多数"大括号"语言中,这仅仅是一种编码风格选择,不会影响代码的编译和运行方式.但是,由于JavaScript的自动分号插入,将开放式大括号放在自己的行上可能会破坏您的代码.这是一个例子:

function good() {
    return {
        foo: 'bar'
    }
}

console.log( 'good:', good() );

function bad()
{
    return
    {
        foo: 'bar'
    }
}

console.log( 'bad:', bad() );
Run Code Online (Sandbox Code Playgroud)

good()bad()功能看起来像他们应该返回相同的结果,该{ foo: 'bar' }对象.那是因为自动分号插入会将bad()函数更改为:

function bad()
{
    return;  // <-- semicolon added, so it returns undefined, not the object
    {
        foo: 'bar'
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我建议所有JavaScript代码使用"行尾的开放式支撑"样式.


Gav*_*vin 8

var myString = "Item1";

var jsObject = 
{
    Item1:
    {
        "apples": "red",
        "oranges": "orange",
    },
    Item2:
    {
        "bananas": "yellow",
        "pears": "green"
    }
};

var keys = Object.keys(jsObject); //get keys from object as an array

keys.forEach(function(key) { //loop through keys array
  console.log(key, key == myString)
});
Run Code Online (Sandbox Code Playgroud)

你可以使用for循环,但你必须在某处存储密钥数组.

var myString = "Item1";

var jsObject = 
{
    Item1:
    {
        "apples": "red",
        "oranges": "orange",
    },
    Item2:
    {
        "bananas": "yellow",
        "pears": "green"
    }
};

var keys = Object.keys(jsObject);

for (var i = 0; i < keys.length; i++) {
  if (myString == keys[i])
    console.log('match: ', keys[i])
}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用for..in获取密钥.

var myString = "Item1";

var jsObject = 
{
    Item1:
    {
        "apples": "red",
        "oranges": "orange",
    },
    Item2:
    {
        "bananas": "yellow",
        "pears": "green"
    }
};

for (var key in jsObject) {
  console.log(key, key == myString)  
}
Run Code Online (Sandbox Code Playgroud)


Mak*_*yen 5

使用直接测试字符串是否是一个属性.hasOwnProperty()

更好的方法是直接测试字符串是否是对象的属性Object.prototype.hasOwnProperty()。该.hasOwnProperty()方法返回一个布尔值,指示对象是否将字符串作为对象的直接属性。如果该属性存在于对象原型上,我不会指示 true。这相当于测试字符串是否为条目,Object.keys()因为该方法仅返回对象自己的属性,这些属性是可枚举的。如果您担心该属性是否可枚举,那么您还可以使用Object.prototype.propertyIsEnumerable()来测试该属性是否也是可枚举的。

使用它比使用该数组创建键数组Object.keys()并搜索该数组更快。

var myString = "Item1";

var jsObject = {
    Item1: {
        "apples": "red",
        "oranges": "orange",
    },
    Item2: {
        "bananas": "yellow",
        "pears": "green"
    }
};

if(jsObject.hasOwnProperty(myString)) {
    //myString is a key on the Object, but not its prototype.
    console.log(myString + ' is a property of jsObject');
}
Run Code Online (Sandbox Code Playgroud)

如果确实想搜索keys(),请使用.indexOf()

对于您这样做的方式,该方法Array.prototype.indexOf()会更合适。该.indexOf()方法搜索数组并返回第一个匹配条目的索引。您可以测试返回值 > -1 作为数组中存在匹配条目的指示符。

var myString = "Item1";

var jsObject = {
    Item1: {
        "apples": "red",
        "oranges": "orange",
    },
    Item2: {
        "bananas": "yellow",
        "pears": "green"
    }
};

if(Object.keys(jsObject).indexOf(myString)>-1) {
    //myString is a property.
    console.log(myString + ' is a property of jsObject');
}
Run Code Online (Sandbox Code Playgroud)