我试图返回并匹配某些具有特定值的键。
如果错误密钥包含"密码" ,那么我只想返回其中包含密码的密码。 case使用firstname_empty删除一个。
我想出了这个,但即使改变了一些逻辑,我最终也会因为某种原因返回所有这3个。
var key = "password";
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}];
for(var i in errors){
if(errors.match(key)){
console.log(errors[i]);
}
}
答案 0 :(得分:1)
var key = "password";
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}];
var resErrors = {};
for(var i in errors[0]){
if(i.match(key)){
resErrors[i] = errors[0][i];
}
}
console.log(resErrors);
您需要对密钥进行数学运算,然后存储密钥是否与新对象匹配。
如果你有对象数组并且想要删除匹配的键,那么遍历数组并在每个循环中创建另一个对象设置值并推送到结果数组。
var key = "password";
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}, {
"password_empty": "Password is empty",
"firstname_empty": "First name is required"
}];
var resArr = [];
errors.forEach(function(erorOb) {
var resErrors = {};
for (var i in erorOb) {
if (i.match(key)) {
resErrors[i] = erorOb[i];
}
}
resArr.push(resErrors);
})
console.log(resArr);
答案 1 :(得分:1)
根据您是要保留原始数据结构并返回新数据结构,还是想要改变原始数据,有多种方法可以获得您想要的结果。
1)改变原始数据结构 - 从对象中删除属性。
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}];
function byKeyword(obj, keyword) {
for (let key in obj) {
if (!key.includes(keyword)) delete obj[key];
}
return [obj];
}
let result = byKeyword(errors[0], 'password');
console.log(result);
2)在对象上添加匹配属性的简单循环。
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}];
function byKeyword(obj, keyword) {
const temp = {};
for (let key in obj) {
if (key.includes(keyword)) temp[key] = obj[key];
}
return [temp];
}
let result = byKeyword(errors[0], 'password');
console.log(result);
3)类似于2但使用reduce
。
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}];
function byKeyword(obj, keyword) {
return Object.keys(obj).reduce((acc, key) => {
if (key.includes(keyword)) acc[0][key] = obj[key];
return acc;
}, [{}]);
}
let result = byKeyword(errors[0], 'password');
console.log(result);
编辑:要获取属性值,您可以再次使用循环...
function byKeyword(obj, keyword) {
const temp = [];
for (let key in obj) {
if (key.includes(keyword)) temp.push(obj[key]);
}
return temp;
}
...或reduce
。
function byKeyword(obj, keyword) {
return Object.keys(obj).reduce((acc, key) => {
if (key.includes(keyword)) acc.push(obj[key]);
return acc;
}, []);
}
希望这很有用。
答案 2 :(得分:0)
答案不是很清楚,所以我有两个选择。
如果您只想返回任何键包含已过滤字符串的错误,您可以尝试以下
var key = "password";
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}, {
"does not have it": "any value"
}];
var filtered = errors
.filter(error => Object.keys(error)
.filter(errorKey => errorKey.indexOf(key) >= 0)
.length > 0)
console.log(filtered);

如果您还想过滤包含过滤词的错误键,您可以尝试
var key = "password";
var errors = [{
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
}, {
"does not have it": "any value"
}];
var filtered = errors
.map(error => Object.keys(error)
.filter(errorKey => errorKey.indexOf(key) >= 0)
.reduce((error, errorKey, index) => {
error[errorKey] = errors[index][errorKey];
return error;
}, {})
)
.filter(error => Object.keys(error).length > 0)
console.log(filtered);

答案 3 :(得分:0)
首先要做的事情:
请使错误对象是数组或对象。在那之后,它应该很容易循环。
在这里,我已将其作为对象实现。
var key = "password";
var errors = {
"password_empty": "Password is empty",
"firstname_empty": "First name is required",
"password_min": "Password needs a min of 6 chars"
};
for(var err in errors){
if(err.match(key)){
console.log(err);
}
}
'for in'检索对象的密钥,这对于测试更安全。
输出:
password_empty
password_min