JSON对象具有“name:value”关系。 我需要一种方法来返回一个对象名而不是它的值。
例如,如果动物[0] .species将返回值“feline”, 我该如何返回“物种”这个名字?
我写的函数要求我检查对象名是否相等 在我返回该对象的值之前输入该函数。
我已经搜索了stackoverflow和W3Schools的解决方案,但没有成功。
var animals = [
{
"animal": "cat",
"species": "feline",
"likes": "yarn",
"dislikes" : "water"
},
{
"animal": "dog",
"species": "canine",
"likes": "rubber balls",
"dislikes": "thunder"
}
];
function lookUp(property){
if (animals[0].property == "species") {
return animals[0].species;
}
}
lookUp("species");
答案 0 :(得分:4)
您可以查看对象上是否存在该属性,如果存在,则返回该属性。
function lookUp(property){
if (animals[0].hasOwnProperty(property)) {
return animals[0][property];
}
}
您也可以使用in
,但它会走原型链寻找属性。有时这是你想要的,但通常不是。我猜你的代码不是你的意图。
使用hasOwnProperty()
确保属性直接存在在原型链上。如果您担心hasOwnProperty
可能是有效的属性名称(例如 species ),请使用Object.prototype.hasOwnProperty.call(animals[0], property)
。这将使用安全引用到该函数。否则,JavaScript会认为您打算尝试使用该属性执行对象的值(这可能是" somestring"不是函数异常)。
答案 1 :(得分:3)
species
function lookUp(property) {
if (animals[0].property === 'species') { // see the quotes ?
return animals[0].species;
}
}
如果您计划在任何其他对象上使用animals
,那么该函数正在使用lookUp
自由变量并且对您没有用。通过以不同的方式编写函数,您可以使其更加通用
function lookUp(object, property) {
if (object.hasOwnProperty(property)) {
return object[property];
}
return null;
}
现在查找一个特定的动物
lookUp(animals[0], 'species'); // => 'feline'
lookUp(animals[1], 'species'); // => 'canine'
lookUp(animals[2], 'species'); // => null
您可以通过定义更高阶的程序来进一步采取这一步骤
function getSpecies(animal) {
return lookUp(animal, 'species');
}
getSpecies(animal[0]); // => 'feline'
getSpecies(animal[1]); // => 'canine'
getSpecies(animal[2]); // => null
根据Alex的评论,最后一部分,您可以使用partial function application,也可以curry使用lookUp
功能。
const lookUp = x => y => y.hasOwnProperty(x) ? y[x] : null;
const species = lookUp('species');
species(animal[0]); // => 'feline'
species(animal[1]); // => 'canine'
species(animal[2]); // => null
答案 2 :(得分:1)
var animal = '[{"animal":"cat","species":"feline","likes":"yarn","dislikes":"water"},{"animal": "dog","species": "canine","likes": "rubber balls","dislikes": "thunder"}]';
var animals = JSON.parse(animal);
function myCheck(e) {
for (key in animals) {
for (keys in animals[key]) {
if (keys == e) {
console.log(keys);
}
}
}
}
myCheck('species');
采取动态对象可能。在上面的示例中,您可以遍历并检查您的密钥是否是您想要的密钥。然后记录您的密钥,或者您可以执行您想要的特定操作。希望这有帮助
答案 3 :(得分:0)
这是一个自适应lookUp函数,它可以将对象或对象数组作为其第一个参数,并将属性作为第二个参数。
var animals = [{
"animal": "cat",
"species": "feline",
"likes": "yarn",
"dislikes": "water"
}, {
"animal": "dog",
"species": "canine",
"likes": "rubber balls",
"dislikes": "thunder"
}, {
"animal": "dog",
"species": "canine",
"likes": "rubber balls",
"dislikes": "thunder"
}];
function lookUp (object, property) {
// check for array
if (object.constructor === Array) {
// loop through, find values and return them
var values = [];
object.forEach(function (value, key) {
if (property in value) {
values.push(value[property]);
}
});
return values;
} else {
// otherwise, check for a property and return the value
return (property in object) ? object[property] : false;
}
}
lookUp(animals, 'species'); // => [ "feline", "canine", "canine" ]
lookUp(animals[0], 'species'); // => "feline"
lookUp(animals, 'fakeProperty'); // => []
lookUp(animals[0], 'fakeProperty'); // => false