javascript - 通过给定的键将两个对象数组合并为一个并复制其他值
问题描述
我有两个包含相似值的对象数组
data = [array1, array2]
array1 = [{hour: "565", age: "21", id: "1", naban: "sdfsd"}, {hour: "515", age: "25", id: "2", naban: "sf"}]
array2 = [{hour: "56454", age: "21", id: "1", too: "898"}, {hour: "8979", age: "25", id: "2", too: "234234"}, {hour: "65465", age: "27", id: "6", too: "123"}]
我有一个数组,其中这两个对象集的值将用于合并
keys= ['id', 'id']
我想合并这些对象并创建一个对象数组,如下所示:
result = [{hour: "565", hour2: "56454", age: "21", age2: "21", id: "1", too: "898", naban: "sdfsd"}, {hour: "515", hour2: "8979", age: "25", age2: "25", id: "2", too: "234234", naban: "sf"}, {hour: "65465", age: "27", id: "6", too: "123"} ]
标准:
- 我想保留所有不在键数组中的信息,例如。如果您查看结果数组,您将看到 hour 和 hour2 值。
- 如果键不匹配,它将按原样推送对象(例如结果数组中的第三项)
这是我到目前为止所做的:
mergeOjects = (object, keys) => {
const sameKeys = Object.values(keys);
const data = Object.values(object);
if (data[0].length > data[1].length) {
const yarrak = data[0].map((item, i) => {
if (item[sameKeys[0]] === data[1][i][sameKeys[1]]) {
return Object.assign({}, item, data[1][i]);
}
return Object.assign({}, item);
});
console.log({ sameKeys, data, yarrak });
} else {
const yarrak = data[1].map((item, i) => {
if (data[0][i]) {
if (item[sameKeys[1]] === data[0][i][sameKeys[0]]) {
return Object.assign({}, item, data[0][i]);
}
}
return Object.assign({}, item);
});
console.log({ sameKeys, data, yarrak });
}};
它可能需要一些清洁,但我现在正试图让逻辑工作,所以提前抱歉。我能够完成第二个条件,但它会覆盖小时值,而不是像示例中那样单独存储
解决方案
您可以减少第二个数组并将所需的键作为查找的通用部分。
var array1 = [{ hour: "565", age: "21", id: "1", naban: "sdfsd" }, { hour: "515", age: "25", id: "2", naban: "sf" }],
array2 = [{ hour: "56454", age: "21", id: "1", too: "898" }, { hour: "8979", age: "25", id: "2", too: "234234" }, { hour: "65465", age: "27", id: "6", too: "123" }],
data = [array1, array2],
keys = ['id', 'id'],
merged = data[1].reduce((r, o) => {
var temp = r.find(q => o[keys[0]] === q[keys[1]]);
if (temp) {
Object
.entries(o)
.forEach(([k, v]) => {
if (keys.includes(k)) return;
temp[k in temp ? k + 2 : k] = v;
});
} else {
r.push({ ...o });
}
return r;
}, data[0]);
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- routing - 如何在一个解决方案中为两个单独的项目在 asp.net core 中设置路由?
- java - 使用 vertx 时 Logback 未创建输出日志文件
- ruby-on-rails - 如何修复 AWS 弹性 beanstalkd 中的捆绑错误
- java - 在下面的一段 java 代码中获取 StackOverflowError
- swift - 如何在不覆盖最后一个字符的情况下设置 NSTextField 的最大长度?
- reactjs - TypeError:Object(...) is not a function in export Default
- command-line - 无法从命令行通过 hugo 创建新帖子
- python - Jupyter-notebook numpy.core.umath 导入失败
- java - 关于使用 smali 库的问题
- java - 如何在谷歌地图的多边形上绘制折线?