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'));