在JSON对象数组中查找值

15

我从JSP得到以下的JSON对象数组:

"Titles":[                          
    {
    "Book3" : "BULLETIN 3"
    }   
    ,
    {
    "Book1" : "BULLETIN 1"
    }
    ,
    {
    "Book2" : "BULLETIN 2"
    }    
]
在 JS 方面,它被解析为一个包含 3 个对象的数组。 现在,当我传递字符串键时,我希望找到/识别一个值。
例如,当我传递“Book2”时,我应该得到值“BULLETIN 2”。 有人可以帮助我识别方法吗?
5个回答

10

试一下

var data = {
    "Titles": [{
        "Book3": "BULLETIN 3"
    }, {
        "Book1": "BULLETIN 1"
    }, {
        "Book2": "BULLETIN 2"
    }]
};

function getValueByKey(key, data) {
    var i, len = data.length;
    
    for (i = 0; i < len; i++) {
        if (data[i] && data[i].hasOwnProperty(key)) {
            return data[i][key];
        }
    }
    
    return -1;
}

console.log(getValueByKey('Book2', data.Titles));


5

拥有:

var x = [{
    "Book3" : "BULLETIN 3"
}, {
    "Book1" : "BULLETIN 1"
}, {
    "Book2" : "BULLETIN 2"
}];

并且

var key = "Book1";

您可以使用以下方式获取该值:

x.filter(function(value) {
    return value.hasOwnProperty(key); // Get only elements, which have such a key
}).shift()[key]; // Get actual value of first element with such a key

注意,如果对象没有定义这样的键,它将抛出异常。

此外,如果有更多具有该键的对象,则仅返回第一个对象。如果您需要从具有该键的所有对象中获取所有值,则可以执行以下操作:

x.filter(function(value) {
    return value.hasOwnProperty(key); // Get only elements, which have such a key
}).map(function(value) {
    return value[key]; // Extract the values only
});

这将给你一个仅包含适当值的数组。
此外,如果您正在使用jQuery,可以使用grep而不是filter:
jQuery.grep(x, function(value) {
    return value.hasOwnProperty(key);
}) /* and so on */;

4
为了实现这一点,您需要循环遍历数组元素的键,并测试给定的键是否存在于数组中,如果存在,则获取其值:

var jsonTitles = [                          
   { "Book3" : "BULLETIN 3" },
   { "Book1" : "BULLETIN 1" },
   { "Book2" : "BULLETIN 2" }    
]

function getValue(key, array) {
  for (var el in array) {
    if (array[el].hasOwnProperty(key)) {
      return array[el][key];
    }
  }
}

alert(getValue("Book1", jsonTitles));

我们使用array[el][key]来获取给定key的值,其中array[el]表示元素数组。

1

让我们创建一个函数来获取数组中的对象,该函数接受两个参数:数组和您想要获取的属性键:

function getObjectInArray(arr, key) {    
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].hasOwnProperty(key)) return arr[i][key];
    }
}

这将循环遍历每个对象,寻找特定的键。
解决方案:现在你可以像这样使用getObjectInArray(titlesJSONArray, "Book2"),它应该返回“BULLETIN 2”。
var titlesJSONArray = [ { "Book3": "BULLETIN 3" }, ... ]; // and so on
var book2 = getObjectInArray(titlesJSONArray, "Book2"); // => "BULLETIN 2"

1

对于在Javascript中进行此类数组/集合操作,我建议您使用underscorejs库。它提供的函数在我的看来能使一切变得更加简单。在您的情况下:

function find_value(array, key) {
    // find will run the provided function for every object in array
    var obj_found = _.find(array, function(obj) {
        // keys returns the keys inside an object
        // so if the key of currently examined object 
        // is what we are looking for, return the obj
        if (_.keys(obj)[0] === key) {
            return obj;
        }
   });
   // if an object with such key was found return its value
   if (obj_found) {
      return obj_found[key];
   } else {
      return null;
   }
}

这里 提供了一个我所建议的可工作的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接