输入是对象的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"存在?没有。
感谢您提供建议!
答案 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运算符会翻译-1
至0
(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"));