我需要从传入的输入数组中获取每个键的数据。假设我的输入数组是:
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';
},
这种解决方案并不理想。
答案 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);