搜索对象的对象以进行数组值匹配

时间:2021-09-13 21:20:18

Given array parameter ary ["value", "value2"]

给定数组参数ary [“value”,“value2”]

I want to loop through an object of objects to find a match for both array values. I've tried as such:

我想遍历一个对象对象,找到两个数组值的匹配项。我试过这样:

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'

    },
}

Goal: be able to return the k : v pair for each match of a value in ary

目标:能够为ary中每个值的匹配返回k:v对

meaning... since ary has value and value2... I want to return a match from the object of key : value and key2 : value2.

意思是......因为ary有值和值2 ...我想从key:value和key2:value2的对象返回一个匹配。

So far this a) isn't working and b) doesn't seem like the most efficient way to do it (3 for loops...)

到目前为止,这a)不起作用,b)似乎不是最有效的方法(3循环......)

1 个解决方案

#1


1  

It is a similar way as you did, and it works.

它与您的方式类似,并且有效。

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

Here is another way using a lookup object:

以下是使用查找对象的另一种方法:

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

#1


1  

It is a similar way as you did, and it works.

它与您的方式类似,并且有效。

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

Here is another way using a lookup object:

以下是使用查找对象的另一种方法:

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