假设我有两个数组
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
}]
答案 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)
您可以使用以下方法获得所需的输出:
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。