JavaScript:仅返回属性值
我想实现一个函数,如果值是基元(非对象或数组)且属性名称以前缀开头,则返回属性值数组 比如说JavaScript:仅返回属性值,javascript,Javascript,我想实现一个函数,如果值是基元(非对象或数组)且属性名称以前缀开头,则返回属性值数组 比如说 var values = function (obj, prefix) { ... } var testObj = { 'a': 1, 'ab': [ { 'c': 2, 'ac': true } ] }; 作为值(testObj,'a')函数调用的结果,我希望得到这样的原语数组:[1,tru
var values = function (obj, prefix) { ... }
var testObj = {
'a': 1,
'ab': [
{
'c': 2,
'ac': true
}
]
};
作为值(testObj,'a')
函数调用的结果,我希望得到这样的原语数组:[1,true]
以下是我的尝试:
var values = function (obj, prefix) {
var res = [];
for (var i in obj) {
if (i.startsWith(prefix)) {
var v = obj[i];
if (typeof v === 'object') {
var r0 = arguments.callee(v, prefix);
res.push(r0);
} else {
res.push(v);
}
}
}
return res;
};
但是它返回了一个错误的结果:
[1,[]]
。如何修复它?您可以根据需要对值使用递归方法
函数值(obj,前缀){
var结果=[];
Object.keys(obj.forEach)(函数(k){
if(obj[k]!==null&&typeof obj[k]===='object'){
result=result.concat(值(obj[k],前缀));
}else if(k.startsWith(前缀)){
结果推送(obj[k]);
}
});
返回结果;
}
var testObj={'a':1,'ab':[{'c':2,'ac':true}],
结果=值(testObj,'a');
控制台日志(结果)代码>(我的城市能量很弱。)
主要问题在于i.startsWith(prefix)
条件。它避免了在数组中输入不包含@prefix的属性名的对象。例如:
{ a: 1, ab: [ /* 0: { 'c': 2, 'ac': true } */ ] }
如您所见,数组中的对象被忽略,因为它的属性名是0
,这是它的索引
如果您真的想得到这个结果:[1,true]
您必须跳过数组并将第一项返回到res.push
var values = function (obj, prefix) {
var res = [];
for (var i in obj) {
if (i.startsWith(prefix)) {
var v = obj[i];
if (typeof v === 'object') {
var isArray = v instanceof Array;
var r0 = arguments.callee(isArray ? v[0] : v, prefix);
res.push(isArray && r0.length === 1 ? r0[0] : r);
} else {
res.push(v);
}
}
}
return res;
};
下面的代码有效
var testObj = {
'a': 1,
'ab': [
{
'c': 2,
'ac': true
}
]
};
var values = function (obj, prefix) {
var res = [];
if(Array.isArray(obj)){
for(var j in obj){
res = res.concat(arguments.callee(obj[j], prefix));
}
}
else if(typeof obj == "object") {
for (var i in obj) {
if (i.startsWith(prefix)) {
var v = obj[i];
if (typeof v === 'object') {
res = res.concat(arguments.callee(v, prefix));
} else {
res.push(v);
}
}
}
}
return res;
};
console.log(values(testObj, 'a'));
这可能是你正在寻找的
var testObj={
"a":1,,
“ab”:[
{
"c":2,,
“ac”:正确
}
]
};
getValues=(o,x)=>Object.keys(o)
.reduce((p,k)=>p.concat(类型o[k]==“对象”?获取值(o[k],x)
:k.indexOf(x)>=0?o[k]
: [])
,[]);
log(getValues(testObj,“a”)代码>
请勾选此项,这将提供您想要的输出。请也添加想要的结果。@NinaScholz[1,true]
为什么在返回1后需要冗余信息true
的意义是什么,预期的结果不应该是[1,[[true]]
var testObj = {
'a': 1,
'ab': [
{
'c': 2,
'ac': true
}
]
};
var res = [];
var values = function (obj, prefix) {
for (var i in obj) {
var v = obj[i];
//Prefix check line can be moved here if you want to check the prefix for object
if (typeof v === 'object') {
arguments.callee(v, prefix);
} else {
if (i.startsWith(prefix)) { //Prefix Check
res.push(v);
}
}
}
return res;
};
console.log(values(testObj,'a'));