【问题标题】:How to merge two array values with over riding the vales replacing empty values如何合并两个数组值并覆盖替换空值
【发布时间】:2020-11-11 10:13:04
【问题描述】:

假设我有两个数组

var arr1 = [{
    "x": "Jan 2020",
    "y": 1
}, {
    "x": "Feb 2020",
    "y": 0
}, {
    "x": "Mar 2020",
    "y": 3
}, {
    "x": "Apr 2020",
    "y": 0
}, {
    "x": "May 2020",
    "y": 5
}, {
    "x": "Jun 2020",
    "y": 0
}, {
    "x": "Jul 2020",
    "y": 7
}, {
    "x": "Aug 2020",
    "y": 0
}, {
    "x": "Sep 2020",
    "y": 9
}, {
    "x": "Oct 2020",
    "y": 0
}, {
    "x": "Nov 2020",
    "y": 11
}, {
    "x": "Dec 2020",
    "y": 0
}]

var arr2 = [{
    "x": "Feb 2020",
    "y": 2
}, {
    "x": "Apr 2020",
    "y": 4
}, {
    "x": "Jun 2020",
    "y": 6
}, {
    "x": "Aug 2020",
    "y": 8
}, {
    "x": "Oct 2020",
    "y": 10
}, {
    "x": "Dec 2020",
    "y": 12
}]

我只想这样合并

var res = [{
    "x": "Jan 2020",
    "y": 1
}, {
    "x": "Feb 2020",
    "y": 2
}, {
    "x": "Mar 2020",
    "y": 3
}, {
    "x": "Apr 2020",
    "y": 4
}, {
    "x": "May 2020",
    "y": 5
}, {
    "x": "Jun 2020",
    "y": 6
}, {
    "x": "Jul 2020",
    "y": 7
}, {
    "x": "Aug 2020",
    "y": 8
}, {
    "x": "Sep 2020",
    "y": 9
}, {
    "x": "Oct 2020",
    "y": 10
}, {
    "x": "Nov 2020",
    "y": 11
}, {
    "x": "Dec 2020",
    "y": 12
}]

【问题讨论】:

  • 请添加您的尝试。什么不起作用?
  • 合并背后的逻辑是什么? y 中的值是否应该相加?应该使用最高/最低值吗?

标签: javascript arrays react-native-android


【解决方案1】:

您必须实现自定义逻辑,例如

const resultArray = [...arr1]
for (let i in arr1) {
  const overrideValueInArray2 = arr2.find(item => item.x === arr1[i].x)
  if (overrideValueInArray2) {
    resultArray[i] = overrideValueInArray2
  }
}

resultArray 应该包含预期的结果。

【讨论】:

    【解决方案2】:

    您可以使用Map,每个数组都有一个循环。

    let arr1 = [{ x: "Jan 2020", y: 1 }, { x: "Feb 2020", y: 0 }, { x: "Mar 2020", y: 3 }, { x: "Apr 2020", y: 0 }, { x: "May 2020", y: 5 }, { x: "Jun 2020", y: 0 }, { x: "Jul 2020", y: 7 }, { x: "Aug 2020", y: 0 }, { x: "Sep 2020", y: 9 }, { x: "Oct 2020", y: 0 }, { x: "Nov 2020", y: 11 }, { x: "Dec 2020", y: 0 }],
        arr2 = [{ x: "Feb 2020", y: 2 }, { x: "Apr 2020", y: 4 }, { x: "Jun 2020", y: 6 }, { x: "Aug 2020", y: 8 }, { x: "Oct 2020", y: 10 }, { x: "Dec 2020", y: 12 }],
        map = new Map,
        fn =  ({ x, y }) => map.set(x, map.get(x) || y),
        result;
    
    arr1.forEach(fn);
    arr2.forEach(fn);
    
    result = Array.from(map, ([x, y]) => ({ x, y }));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您可以使用以下方法获得所需的输出:

      • 将两个数组合并为一个。您可以为此使用spread syntax
      • 使用 reduce()Object.assign() 创建一个对象,该对象具有来自对象的值作为要用于合并的键,即在您的情况下为 x
      • 使用Object.values() 获取结果数组。

      const arr1 = [{"x": "Jan 2020","y": 1}, {"x": "Feb 2020","y": 0}, {"x": "Mar 2020","y": 3}, {"x": "Apr 2020","y": 0}, {"x": "May 2020","y": 5}, {"x": "Jun 2020","y": 0}, {"x": "Jul 2020","y": 7}, {"x": "Aug 2020","y": 0}, {"x": "Sep 2020","y": 9}, {"x": "Oct 2020","y": 0}, {"x": "Nov 2020","y": 11}, {"x": "Dec 2020","y": 0}];
      const arr2 = [{"x": "Feb 2020","y": 2}, {"x": "Apr 2020","y": 4}, {"x": "Jun 2020","y": 6}, {"x": "Aug 2020","y": 8}, {"x": "Oct 2020","y": 10}, {"x": "Dec 2020","y": 12}];
      
      const result = Object.values(
        [...arr1, ...arr2].reduce((r, c) => (r[c.x] = Object.assign({}, c), r), {})
      );
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        【解决方案4】:

        在这样的结构中,您使用y: 0 作为占位符并且arr2 已经正确排序。您可以将.map() 替换为arr1 并将所有元素替换为y: 0

        const arr1 = [{"x": "Jan 2020","y": 1}, {"x": "Feb 2020","y": 0}, {"x": "Mar 2020","y": 3}, {"x": "Apr 2020","y": 0}, {"x": "May 2020","y": 5}, {"x": "Jun 2020","y": 0}, {"x": "Jul 2020","y": 7}, {"x": "Aug 2020","y": 0}, {"x": "Sep 2020","y": 9}, {"x": "Oct 2020","y": 0}, {"x": "Nov 2020","y": 11}, {"x": "Dec 2020","y": 0}];
        const arr2 = [{"x": "Feb 2020","y": 2}, {"x": "Apr 2020","y": 4}, {"x": "Jun 2020","y": 6}, {"x": "Aug 2020","y": 8}, {"x": "Oct 2020","y": 10}, {"x": "Dec 2020","y": 12}];
        
        let i = 0;
        const result = arr1.map(element => element.y ? element : arr2[i++]);
        
        console.log(result);

        这使用了0 是虚假的这一事实,但是如果您愿意,您也可以更明确地将element.y 替换为element.y == 0condition ? exprIfTrue : exprIfFalse 语法称为conditional operator

        【讨论】:

          猜你喜欢
          • 2019-10-04
          • 1970-01-01
          • 2022-11-02
          • 2022-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多