js怎样通过arr3把arr2变成arr4

clipboard.png

var arr2 = [{1: '1'}, {2: '2'}, {3: '3'}, {5: '5'}];

var arr3 = [{1: '1'}, {2: '2'}, {3: '3'}, {4: '4'}, {5: '5'}, {6: '6'}];

var arr4 = [{1: '1'}, {2: '2'}, {3: '3'}, {4: '0'}, {5: '5'}, {6: '0'}];
阅读 2.6k
2 个回答
var arr2 = [{1: '1'}, {2: '2'}, {3: '3'}, {5: '5'}];

var arr3 = [{1: '1'}, {2: '2'}, {3: '3'}, {4: '4'}, {5: '5'}, {6: '6'}];

var arr4 = [];

var obj = {};
for (var i=0; i<arr2.length; i++) {
    var temp = arr2[i];
    for (var key in temp) {
        obj[key] = temp[key];
    }
}
for (var j=0; j<arr3.length; j++) {
    var temp = arr3[j];
    for (var key in temp) {
        if (obj[key]) {
            var subobj = {};
            subobj[key] = obj[key];
            arr4.push(subobj)
        } else {
            var subobj = {};
            subobj[key] = '0';
            arr4.push(subobj)
        }
    }
}

ES 6 版本(按照 Python 的思想写的):

// jshint esversion:6

let array_to_map = function(arr) {
  return arr.reduce(function(a, b){
    for(let [k, v] of Object.entries(b)){
      a.set(k, v);
    }
    return a;
  }, new Map());
};

let updatedefault = function(a, b, d) {
  let am = array_to_map(a);
  let bm = array_to_map(b);
  for(let [k, v] of bm){
    if(typeof am.get(k) == "undefined"){
      am.set(k, d);
    }
  }
  let r = [];
  for(let [k, v] of am){
    let o = {};
    o[k] = v;
    r.push(o);
  }

  r.sort(function(a, b){
    let x = Object.keys(a)[0];
    let y = Object.keys(b)[0];
    if(x>y){
      return 1;
    }else if(x<y){
      return -1;
    }else{
      return 0;
    }
  });

  return r;
};

let arr2 = [{1: '1'}, {2: '2'}, {3: '3'}, {5: '5'}];
let arr3 = [{1: '1'}, {2: '2'}, {3: '3'}, {4: '4'}, {5: '5'}, {6: '6'}];
let arr4 = updatedefault(arr2, arr3, '0');
console.log(arr4);

有几点是问题中没有明确的:

  • 数组里的每个对象一定只有一个键值对吗?

  • 如果 arr2 和 arr3 里都有某个键,但是值不同怎么办?

  • 如果 arr2 和 arr3 里都有某个键值对,但是位于不同的位置,要怎么办?

另外这个数据结构很奇怪、很难用。默认值 '0' 更是奇怪。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题