将数组与对象键进行比较并维护顺序

时间:2015-10-08 03:15:28

标签: javascript jquery arrays

我需要从传入的输入数组中获取每个键的数据。假设我的输入数组是:

Input array: ['我','很','好'](我非常好)

我有一个对象,每个对象都有匹配的键,这些键都有更多的相关数据。

我希望以相同的顺序恢复数据。

不幸的是,输入数据顺序可能并不总是与键在对象中出现的顺序相匹配,但我需要在返回结果密钥数据时保持顺序。

基本上,我如何遍历一个数组(让我们说input array)并与一个对象进行比较并以相同的顺序返回那些匹配键的数据?

对象

var myObj = {
   "Foo": 
   {
       'wo' :  ['I/me','我'],
       'hao'   : ['good','好'],
   },
   "Bar": 
   {
       'xi': ['wash', '洗'],
       'hen'   : ['very', '很']
   },
   ...
}

获取功能

getValues : function (inputArray) {
        var result = [];
        for (obj in myObj) {
            for (key in myObj[obj]) {
                for (var i = 0; i < inputArray.length; i++) {
                    //IE: if 我 === 我 
                    if (inputArray[i] === myObj[obj][key][1]) {
                        result.push(key);
                        if (result.length >= inputArray.length) {
                            return result;
                        }
                        ...

结果['wo', 'hao', 'hen'](相当于'我,好,非常')

但结果必须是:['wo', 'hen', 'hao'](相当于'我,非常,好')

注意:如果有任何帮助,我正在使用jQuery。

编辑:我能做的就是先拆分字符串,然后遍历inputArray的长度,然后逐个调用getValues

这个问题是,现在我开始在每次调用时循环遍历myObj数据结构,而不是使用一串值调用一次并循环遍历myObj一次,添加每个密钥,因为它扫描列表。

            var split = inputArray.split('');
            var resultsList = [];

            for (var i = 0; i < split.length; i++) {
                resultsList.push(getValues(split[i]));
            }


getValues : function (word) {

    for (obj in myObj) {
        for (key in myObj[obj]) {
            if (character === myObj[obj][key][0]) {
                return key;
            }
        }
    }
    return 'not found';
},

这种解决方案并不理想。

3 个答案:

答案 0 :(得分:1)

问题是您正在搜索对象中的每个键而不是inputArray中的每个位置:

for (obj in myObj) {
    for (key in myObj[obj]) {
        for (var i = 0; i < inputArray.length; i++) {

应该是:

for (var i = 0; i < inputArray.length; i++) {
    for (obj in myObj) {
        for (key in myObj[obj]) {

这种方式可确保它找到并添加输入的顺序,而不是按顺序添加到对象中。

    var myObj = {
           "Foo": 
       {
           'wo' :  ['I/me','我'],
           'hao'   : ['good','好'],
       },
       "Bar": 
       {
           'xi': ['wash', '洗'],
           'hen'   : ['very', '很']
       },
    };
    function getValues (inputArray) {
        var result = [];

        for (var i = 0; i < inputArray.length; i++) {
            for (obj in myObj) {
                for (key in myObj[obj]) {
                    if (inputArray[i] === myObj[obj][key][1]) {
                        result.push(key);
                        //stop loops if results list matches input list
                        if (result.length >= inputArray.length) {
                            return result;
                        }
                    }
                }
            }
        }
    }
    var inputResult = getValues(['我','很','好'])
    ,   result = '';
    for(var index = 0; index < inputResult.length; index ++){
        result += inputResult[index] + ' ';
    }
    document.write(result);

答案 1 :(得分:1)

尝试使用$.each()$.inArray()

var arr = ['我', '很', '好']

, myObj = {
  "Foo": {
    'wo': ['I/me', '我'],
    'hao': ['good', '好'],
  },
  "Bar": {
    'xi': ['wash', '洗'],
    'hen': ['very', '很']
  }
}

, res = [];

$.each(myObj, function(index, value) {
  $.each(value, function(key, val) {
    if ($.inArray(val[1], arr) !== -1) {
      // set `key` at `$.inArray(val[1], arr)` index within `res` array
      res[$.inArray(val[1], arr)] = key
    }
  })
});

console.log(res);

$("body").html(res.toString())
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>

答案 2 :(得分:0)

这个怎么样?查看Fiddle

var arr = ['我','很','好'];

var myObj = {
   "Foo": 
   {
       'wo' :  ['I/me','我'],
       'hao'   : ['good','好'],
   },
   "Bar": 
   {
       'xi': ['wash', '洗'],
       'hen'   : ['very', '很']
   }
}

function getKey(character) 
{
    for(obj in myObj)
    {
        var objVal = myObj[obj];
        for(innerobj in objVal)
        {
            var innerobjVal = objVal[innerobj];
            if($.inArray(character, innerobjVal) !== -1)
            {
               return innerobj;
            }
        }
    }
}

var resultArr = arr.map(getKey);

console.log(resultArr);