单个变量代表多个键名-javascript

单个变量代表多个键名-javascript,javascript,Javascript,我有一个数组,类似这样: array = [ { "type": "apple", "color": "red", "id": "redApple" }, { "type": "grape", "color": "green", "id": "greenGrape",

我有一个数组,类似这样:

array =     
    [
        {
            "type": "apple",
            "color": "red",
            "id": "redApple"
        },
        {
            "type": "grape",
            "color": "green",
            "id": "greenGrape",
            "options": [
                {
                    "bunchName": "bunch1",
                    "size": "8"
                },
                {
                    "bunchName": "bunch2",
                    "size": "10"
                },
                {
                    "bunchName": "bunch3",
                    "size": "5"
                }
            ]
        }
    ]
我有一个在数组中搜索值的函数

function findValue (index, key) {
    return array[index][key];
}

var value = findValue(0, "id");
// returns redApple
如果我想在数组中找到更深的内容,有没有一种方法可以将单个参数传递给函数?例如,如果我想查找
“bunchName”
,我可以传递类似于
1的选项[0]。bunchName“
,然后返回
“bunch1”

我想要一个可以处理多个键的函数。在我真正的项目中,有时我在第一层寻找一些东西,有时我在第二层,有时在第三层,等等


如果出于某种原因,可以使用jQuery

据我所知,findValue(object,“bunchName”)的输出;应该是“bunch3”,在OP的示例中,对象是数组。
var对象=
[
{
“类型”:“苹果”,
“颜色”:“红色”,
“id”:“红苹果”
},
{
“类型”:“葡萄”,
“颜色”:“绿色”,
“id”:“绿葡萄”,
“选择”:[
{
“bunchName”:“bunch1”,
“大小”:“8”
},
{
“bunchName”:“bunch2”,
“大小”:“10”
},
{
“bunchName”:“bunch3”,
“大小”:“5”
}
]
}
]
变量findValue=(对象,键)=>{
var结果值;
var rec=(currentObj)=>{
if(currentObj&&typeof currentObj==“对象”){
for(让curKey输入currentObj){
如果(curKey==键){
结果值=当前对象[curKey];
}否则{
rec(currentObj[curKey]);
}
}
}
}
rec(对象);
返回结果值;
}

log(findValue(对象,“bunchName”)
您可以添加一个函数,该函数接受一个对象和一个键,并返回
对象[key]
,然后按点将键字符串拆分为单个键的列表。然后,您可以遍历关键点列表,并使用该函数获取对象中每个级别的值:

我刚刚编写的完全未经测试的代码:

function valueByKey(obj, key) {
  if (obj) {
    return obj[key];
  }
}

function findValue(index, key) {
  const keys = key.split('.');
  let value = array[index];
  for (let i = 0; i < keys.length; i++) {
    value = valueByKey(value, keys[i]);
  }
  return value;
}
功能值按键(obj,键){
如果(obj){
返回obj[键];
}
}
函数findValue(索引、键){
const keys=key.split('.');
让值=数组[索引];
for(设i=0;i
非经常性解决方案:

var array = [
    {
        'a': {
            'b': 1
        }
    }
];

function findValue(index, key) {
    var keys = key.split('.');
    var tmp = array[index];
    for (var i = 0; i < keys.length; i++) {
        if (!tmp.hasOwnProperty(keys[i]) || typeof tmp !== 'object') {
            // throw an exception, or return default value – property not found.
        }
        tmp = tmp[keys[i]];
    }

    return tmp;
}

findValue(0, 'a.b');
var数组=[
{
“a”:{
“b”:1
}
}
];
函数findValue(索引、键){
var keys=key.split('.');
var tmp=数组[索引];
对于(变量i=0;i
您可以获取字符串,替换括号,拆分字符串并减少结果的路径。该函数使用默认对象来表示缺少或未给定的属性

函数getValue(对象、路径){
返回路径
.替换(/\[/g,'。)
.替换(/\]/g'')
.split(“.”)
.reduce(函数(o,k){return(o |{})[k]},对象);
}
函数findValue(索引、路径){
返回getValue(数组[索引],路径);
}
var数组=[{type:“apple”,color:“red”,id:“redApple”},{type:“grape”,color:“green”,id:“greenGrape”,选项:[{bunchName:“bunch1”,size:“8”},{bunchName:“bunch2”,size:“10”},{bunchName:“bunch3”,size:“5”}];

log(findValue(1,“选项[0].bunchName”)请通过获取指向包含对象的数组的对象的路径来指定所需的结果。我不理解您的评论。可能希望使用像lodash这样的库来简化此操作。如果将
'options.bunchName'
作为函数的参数,请添加结果。可以使用像lodash这样的库。否则,它可以在JavaScript中使用递归、循环或
eval
完成。这是一个很好的答案。我唯一的问题是我不想使用.reduce,因为它与旧版本的IE存在兼容性问题。但是我能够通过解决代码reduce部分的问题来使用它。谢谢