2016-05-13 39 views
-1

所以给出一个简单的JSON对象匹配的Json键和数组值替换

[ 
    {"a": 1}, 
    {"b": 2}, 
    {"c": 3}, 
    {"d": 4} 
] 

像这样

var arr = ["A", "B", "C"]; 

我想写的最有效的功能,以较低的情况相匹配的数组键与他们的大写柜台部分,并用大写字母替换它们,我开始将数组转换成一个对象,所以我不必一遍又一遍地迭代,但是Im卡住了。有人能告诉我他们将如何以最有效的方式处理这个问题吗?

+0

你期待所有密钥改变_except_'D'? – Andy

回答

0

不会对你的钥匙/可能的密钥量的进一步信息,试图让一个通用的解决办法是这样的:

var arr = [ 
 
    {"a": 1}, 
 
    {"b": 2}, 
 
    {"c": 3}, 
 
    {"d": 4} 
 
] 
 

 
var match = ["A", "B", "C"]; 
 

 
var objMatch = {} 
 

 
for(var i=0;i<match.length;i++) objMatch[match[i].toLowerCase()] = match[i] // pass it to an object for efficient matching 
 

 
for(var i=0;i<arr.length;i++){ 
 
    for(var key in arr[i]){ // check if we need to replace the key 
 
     if(objMatch.hasOwnProperty(key)){ 
 
      var temp = arr[i][key] // keep old value 
 
      delete arr[i][key] // delete key 
 
      arr[i][objMatch[key]] = temp // set new key with same old value 
 
     } 
 
    } 
 
} 
 

 
console.log(arr)

0
var a=[ 
{"a": 1}, 
{"b": 2}, 
{"c": 3}, 
{"d": 4} 
]; 

var arr = ["A", "B", "C"]; 

在对象的原型链中定义的方法重命名对象键:

Object.prototype.changeKey = function (oName, nName) { 
    if (oName == nName) { 
     return this; 
    } 
    if (this.hasOwnProperty(oName)) { 
     this[nName] = this[oName]; 
     delete this[oName]; 
    } 
return this; 
}; 

然后找到该数组中的元素相匹配的键,然后改变它:

for(var i=0;i<arr.length;i++){ 
    for(key in a[i]){ 
    if(key === arr[i].toLowerCase()){a[i].changeKey (key,arr[i])} 
    } 
} 

这里是一个fiddle

0

你可以使用一个辅助对象和循环THROU所有项目和所有按键。

var arr0 = [{ "a": 1 }, { "b": 2 }, { "c": 3 }, { "d": 4 }], 
 
    arr1 = ["A", "B", "C"], 
 
    obj = Object.create(null); 
 

 
arr1.forEach(function (a) { 
 
    obj[a.toUpperCase()] = a; 
 
}); 
 
arr0.forEach(function (a) { 
 
    Object.keys(a).forEach(function (k) { 
 
     var v = a[k]; 
 
     if (k.toUpperCase() in obj) { 
 
      delete a[k]; 
 
      a[obj[k.toUpperCase()]] = v; 
 
     } 
 
    }); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(arr0, 0, 4) + '</pre>');

0

从我从你的问题理解

var arrayOne = [ 
{"a": 1}, 
{"b": 2}, 
{"c": 3}, 
{"d": 4} 
]; 
var arrayTwo = ["A", "B", "C"]; 
var tempArray = {}; 
$.each(arrayOne, function(key,value){ 
    for(arrayOneKey in value){ 
    $.each(arrayTwo, function(index,vl) { 
     if(vl.toLowerCase() == arrayOneKey.toLowerCase()){ 
     tempArray[vl]=key+1; 
     } 
    }); 
    } 
}); 
console.log(tempArray); 
+0

你可能想考虑将jQuery重写为vanilla JS,因为它在问题中没有提及。 – Andy

0

不要让事情复杂化。使用map并返回一个新的数组:

function transform(arr, keys) { 
    return arr.map(function(el) { 
    var obj = {}; 
    var key = Object.keys(el)[0]; 
    var uc = key.toUpperCase(); 
    obj[keys.indexOf(uc) > -1 ? uc : key] = el[key]; 
    return obj; 
    }); 
} 

transform(input, arr); 

DEMO