匹配Json键并替换为数组中的值

时间:2016-05-13 17:22:39

标签: javascript arrays json sorting

所以给出一个简单的json对象

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

和这样的数组

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

我想编写最有效的函数来匹配小写键与它们的大写计数器部分并用大写字母替换它,我开始将数组转换为一个对象,所以我不必反复迭代但我卡住了。有人可以告诉我他们如何以最有效的方式处理这个问题吗?

5 个答案:

答案 0 :(得分: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)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

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

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

在Object的原型链中定义一个方法来重命名Object键:

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

答案 2 :(得分:0)

您可以使用辅助对象并循环所有项目和所有键。

&#13;
&#13;
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>');
&#13;
&#13;
&#13;

答案 3 :(得分: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);

答案 4 :(得分: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