2014-02-06 168 views
0

鉴于阵列参数对象的对象ary ["value", "value2"]搜索数组值匹配

我想遍历对象的目的是找到两个数组值匹配。我已经试过这样:

function findMatch (ary) { 

    storageArray = []; 
    mykeys = []; 
    myvalues = []; 

    for (var i = 0; i < ary.length; i++) { 
    for (obj in object) { 
     for (key in object[obj]) { 
     if (ary[i] in object[obj]) { 
      mykeys.push(key); 
      myvalues.push(object[obj][ary[i]]); 
     } 
     } 
    } 
    storageArray .push(mykeys, myvalues); 
    return storageArray; 
} 

var object = { 
    "subobject" : 
    { 
     'key' : 'value', 
     'key2' : 'value2', 
     'key3' : 'value3'  
    }, 
    "subobject2" : 
    { 
     'key4' : 'value4' 

    }, 
} 

目标:能够在ary

意义返回k : v对一个值的每场比赛......因为aryvaluevalue2 ......我想返回来自key : valuekey2 : value2的对象的匹配。

到目前为止这个)不能正常工作和b)似乎不是最有效的方式做到这一点(3 for循环...)

+0

我不太下面......你的意思是返回'[{“钥匙”:“值”},{” KEY2 “:” 值2" }]'?如果'object'有另一个项目''subobject3:{“key”:“value”}'? – Passerby

+0

@Passerby是的,这就是我的意思,如果它有另一个术语有什么错? – Growler

+1

因为我的例子'subobject3'只有一个匹配('“value”')。那么期望的输出是什么呢? – Passerby

回答

1

它是一种类似的方式,你做到了,有用。

function findMatch(array, object) { 
    var result = []; 
    for (var sub in object) { 
     var subObj = object[sub]; 
     for (var key in subObj) { 
      for (var i = 0; i < array.length; i++) { 
       if (subObj[key] === array[i]) { 
        result.push({ 
         k: key, 
         v: subObj[key] 
        }); 
       } 
      } 
     } 
    } 
    return result; 
} 

var result = findMatch(['value', 'value2'], object); 
for (var i = 0; i < result.length; i++) { 
    console.log(result[i].k + " : " + result[i].v); 
} 

下面是一个使用查找对象的另一种方式:

function findMatch(array, object) { 
    var result = []; 
    var lookup = {}; 
    for (var sub in object) { 
     var subObj = object[sub]; 
     for (var key in subObj) { 
      var value = subObj[key]; 
      if (!lookup[value]) { 
       lookup[value] = []; 
      } 
      lookup[value].push(key); 
     } 
    } 
    for (var i = 0; i < array.length; i++) { 
     var val = array[i]; 
     var foundArr = lookup[val]; 
     if (foundArr) { 
      for (var j = 0; j < foundArr.length; j++) { 
       result.push({ 
        k: foundArr[j], 
        v: val 
       }); 
      } 
     } 
    } 
    return result; 
} 

var result = findMatch(['value', 'value2'], object); 
for (var i = 0; i < result.length; i++) { 
    console.log(result[i].k + " : " + result[i].v); 
}