在对象数组中查找键

时间:2017-06-07 04:10:36

标签: javascript

输入是对象的JSON数组。

[
    {
        "name": "JOHN",
        "age": "90",
        "ID": "123",
        "country": "UK",
        "email": "john@test.com"
    }, {
        "name": "PETER",
        "age": "10",
        "ID": "456",
        "country": "",
    }
]

在Javascript中找到所有数组中密钥的最佳方法是什么,如果存在则返回ok。例如," name"存在?是的,约翰和彼得。是"电子邮件"存在?是的,john @ test.com。 " city"存在?没有。

感谢您提供建议!

3 个答案:

答案 0 :(得分:2)

如果你喜欢神奇的oneliner:

your_array = [
    {
        "name": "JOHN",
        "age": "90",
        "ID": "123",
        "country": "UK",
        "email": "john@test.com"
    }, {
        "name": "PETER",
        "age": "10",
        "ID": "456",
        "country": "",
    }
]

your_array.some(x => 'email' in x)
your_array.some(x => 'name' in x)
your_array.some(x => 'city' in x)

答案 1 :(得分:2)

迭代数组,获取对象的键,扫描键,如果找到则返回值。过滤生成的数组以删除之后的任何未定义/假值(可能需要修改,具体取决于您的预期值 - 特别是如果您想要包含虚假值{'ID':0})。

var arr = [{
  "name": "JOHN",
  "age": "90",
  "ID": "123",
  "country": "UK",
  "email": "john@test.com"
}, {
  "name": "PETER",
  "age": "10",
  "ID": "456",
  "country": ""
}];

var key = 'name';
var values = arr.map(obj => ~Object.keys(obj).indexOf(key) && obj[key]).filter(v => v);

console.log(values)

如果不写书,这里有一些线索可以解释:

  • map遍历数组并使用映射函数生成新数组

  • ~按位NOT,执行-(N+1),这在使用indexOf()时很有用,因为不匹配会返回-1,但NOT运算符会翻译-10(false);
    数学:-(-1+1)=-(0)=0

  • [更多关于按位NOT]
    indexOf匹配时,返回0(或更高)。使用上面提到的-(N+1),这意味着~运算符会将任何匹配转换为负数,这是真实的。 -(0+1)=-1-(3+1)=-4 - 所有真理

  • 如果~...indexOf()为真,则逻辑AND运算符(&&)将执行第二个表达式,该表达式从对象中检索值并将其返回

  • Object.keys()获取对象的键

  • filter()遍历一个数组,只保留匹配函数返回true的元素
  • v=>v是匹配函数,相当于function(v){ return v; },这意味着如果v是真实的,请保留该值;如果是假的,请不要将值保留在数组中(类似于其他语言的grep

编辑:
正如RobG指出的那样,现在可以使用~[].indexOf()代替[].includes(),使代码看起来像Object.keys(obj).includes(key)。这应该删除一些不太了解的操作符(对于初学者)以及使代码更具语义和可读性。

答案 2 :(得分:0)

var arr=[
          {
              "name": "JOHN",
              "age": "90",
              "ID": "123",
              "country": "UK",
              "email": "john@test.com"
          }, {
              "name": "PETER",
              "age": "10",
              "ID": "456",
              "country": "",
          }
        ];
var fu=function(arr,prop){ 
   return $.map(arr,(v,k)=>{if(v.hasOwnProperty(prop)){return arr[k][prop]}});
}
console.log(fu(arr,"ID"));
console.log(fu(arr,"name"));
console.log(fu(arr,"email"));