Javascript查找json值

IT技术 javascript json
2021-01-17 06:03:44

我需要在 json 国家/地区列表中进行搜索。json 是这样的:

[ 
{"name": "Afghanistan", "code": "AF"}, 
{"name": "Åland Islands", "code": "AX"}, 
{"name": "Albania", "code": "AL"}, 
{"name": "Algeria", "code": "DZ"}
]

我只从数据库中获取代码并输出整个名称。所以如果我得到“AL”,我想从json“Albania”中检索

5个回答

我建议使用 JavaScript 的 Array 方法filter()按值标识元素。它通过使用“函数来测试数组的每个元素来过滤数据。返回 true 以保留元素,否则返回 false..”

以下函数过滤数据,返回回调返回的数据true,即其中data.code等于请求的国家/地区代码。

function getCountryByCode(code) {
  return data.filter(
      function(data){ return data.code == code }
  );
}

var found = getCountryByCode('DZ');

请看下面的演示:

这是一个 JSFiddle

我知道这个答案已经超过 5 年了,但是它返回“仅回调返回 true 的值”的说法是不正确的。它返回一个对象数组其中每个匹配对象中的值都会导致回调返回 true。您的代码确实认识到这一点,但我觉得该声明具有误导性
2021-03-22 06:03:44
这个看起来像我的答案。更紧凑。
2021-04-07 06:03:44
var obj = [
  {"name": "Afghanistan", "code": "AF"}, 
  {"name": "Åland Islands", "code": "AX"}, 
  {"name": "Albania", "code": "AL"}, 
  {"name": "Algeria", "code": "DZ"}
];

// the code you're looking for
var needle = 'AL';

// iterate over each element in the array
for (var i = 0; i < obj.length; i++){
  // look for the entry with a matching `code` value
  if (obj[i].code == needle){
     // we found it
    // obj[i].name is the matched result
  }
}
@Tropicalista 事实上,您应该将过滤器逻辑移至您的数据库引擎!在过滤、排序或分组(假设您设置正确的索引)方面,DB 将始终是最快的。
2021-03-18 06:03:44
@jaibalaji 如果您支持 IE,则不会。另请记住,这篇文章已经发布 5 年了,兼容性发生了变化。
2021-03-19 06:03:44
@ivoszz:除了Array.forEach在兼容性方面可能会喜怒无常。
2021-03-26 06:03:44
正如我所说,这是正确的。但是试想一下这个包含 100.000 个项目的列表。
2021-04-01 06:03:44
它缺少昏迷: for (var i = 0; i < obj.length ; i++){
2021-04-07 06:03:44

只需find()以函数式的方式使用 ES6函数:

var data=[{name:"Afghanistan",code:"AF"},{name:"Åland Islands",code:"AX"},{name:"Albania",code:"AL"},{name:"Algeria",code:"DZ"}];

let country = data.find(el => el.code === "AL");
// => {name: "Albania", code: "AL"}
console.log(country["name"]);

或 Lodash _.find

var data=[{name:"Afghanistan",code:"AF"},{name:"Åland Islands",code:"AX"},{name:"Albania",code:"AL"},{name:"Algeria",code:"DZ"}];

let country = _.find(data, ["code", "AL"]);
// => {name: "Albania", code: "AL"}
console.log(country["name"]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

首先将此结构转换为“字典”对象:

dict = {}
json.forEach(function(x) {
    dict[x.code] = x.name
})

然后简单地

countryName = dict[countryCode]

对于国家列表,这无关紧要,但对于较大的列表,此方法可保证即时查找,而简单搜索将取决于列表大小。

@Purefan 是的,这就是我的想法。
2021-03-23 06:03:44
我完全不确定“这种方法保证即时查找”是真的有没有保证该实现除了顺序查找之外什么都不做?如果不是,我们能确定没有重要的浏览器实现会进行顺序查找吗?
2021-03-29 06:03:44
嗯?countryName = dict[code],可以吗?或者我错过了什么?
2021-04-01 06:03:44
@Auspex 这个答案与您的问题相关stackoverflow.com/a/28225058/363217
2021-04-03 06:03:44

使@showdev答案更加笼统

var getObjectByValue = function (array, key, value) {
    return array.filter(function (object) {
        return object[key] === value;
    });
};

例子:

getObjectByValue(data, "code", "DZ" );