【问题标题】:Match Json keys and replace with values in array匹配 Json 键并替换为数组中的值
【发布时间】:2016-05-13 17:22:38
【问题描述】:

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

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

还有这样的数组

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

我想编写最有效的函数来匹配小写键与其大写对应部分并用大写字母替换它们,我首先将数组转换为一个对象,这样我就不必一遍又一遍地迭代,但我卡住了。有人可以告诉我他们将如何以最有效的方式处理这个问题吗?

【问题讨论】:

  • 您是否希望更改所有键除了 d

标签: javascript arrays json sorting


【解决方案1】:

如果没有关于您的密钥/可能密钥数量的更多信息,尝试制定通用解决方案将是这样的:

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)

【讨论】:

    【解决方案2】:

    我从你的问题中了解到

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

    【讨论】:

    • 您可能需要考虑将 jQuery 重写为 vanilla JS,因为问题中没有提到它。
    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

      不要让事情变得复杂。使用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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          • 1970-01-01
          • 2014-11-24
          • 1970-01-01
          • 2020-09-29
          • 2018-05-11
          相关资源
          最近更新 更多