jQuery:比较具有相同键的数组并填补空白

时间:2015-10-12 16:39:09

标签: jquery

arrayA = [
  ['10-01', "foo"],
  ['10-02', "bar"],
  ['10-03', "baz"]
];

arrayB = [
  ['10-01', 1],
  ['10-03', 3]
];

arrayA是一个具有不重要值的连续日期列表。

在arrayB中,我想填写缺少的日期(' 10-02')以阅读" 0"。因此我想使用arrayA的键作为map(尽管两者都在同一天开始)。

然后数组将读取

arrayB = [
  ['10-01', 1],
  ['10-02', 0],
  ['10-03', 3]
];

我不知道如何:/

测试:https://jsfiddle.net/x37zor7y/1/

2 个答案:

答案 0 :(得分:1)

您最快的方法是将数组转换为对象(因为10-x是唯一键),合并它们并将它们转换回来。通过这种方式,JavaScript引擎可以使用类似HashMap的内容来检查是否存在,并且复杂性大致从O(n^2)O(n)



var arrayA = [
      ['10-1', 'foo'],
      ['10-2', 'bar'],
      ['10-3', 'baz']
    ],
    arrayB = [
      ['10-1', 1],
      ['10-3', 3]
    ];

function twodimensionalArrayToObject(array) {
  return array.reduce(function(obj, entry) {
    obj[entry[0]] = entry[1];
    return obj;
  }, {});
}

function objectToTwodimensionalArray(obj) {
  return Object.keys(obj).map(function(key) {
    return[key, obj[key]];
  });
}

function extendWithZeros(obj1, obj2) {
  for (var key in obj2) {
    if (obj2.hasOwnProperty(key)) {
      if (!obj1.hasOwnProperty(key)) {
        obj1[key] = 0;
      }
    }
  }
  return obj1;
}

document.write(
  JSON.stringify(
    objectToTwodimensionalArray(
      extendWithZeros(
        twodimensionalArrayToObject(arrayB),
        twodimensionalArrayToObject(arrayA)
      )
    )
  )
);




答案 1 :(得分:1)

将两个数组映射到一组只包含日期值的新数组。

然后循环连续的并填充空洞,如果该值在非连续数组中已经存在

var allDates = arrayA.map(function(subArr){
    return subArr[0];
});

var arrBDates = arrayB.map(function(subArr){
    return subArr[0];
});

allDates.forEach(function(dateVal){
    if(arrBDates.indexOf(dateVal) ==-1){
       arrayB.push([dateVal, 0]) 
    }
});
// sort updated arrayB
 arrayB.sort(function(a,b){
   return a[0]>b[0]
});

DEMO