如何合并两个数组值,并替换空值

时间:2020-11-11 10:13:04

标签: javascript arrays react-native-android

假设我有两个数组

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
}]

4 个答案:

答案 0 :(得分: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应该包含预期的结果。

答案 1 :(得分:1)

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

  • 将两个数组合并为一个数组。您可以为此使用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; }

答案 2 :(得分:1)

对于每个数组,您可以使用一个带有单个循环的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 :(得分:0)

使用类似的结构,在其中使用y: 0作为占位符,并且arr2已经正确排序。您可以只在arr1.map(),然后用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 == 0,也可以更加明确。 condition ? exprIfTrue : exprIfFalse语法称为conditional operator