JSON如何返回对象名称而不是其值

时间:2016-02-05 14:17:13

标签: javascript

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");

4 个答案:

答案 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