不同对象之间的递归,并将它们唯一地组合在一起,不重复
Recursion between different objects and combine them uniquely, without duplicate
我一直在尝试如何对两个属性相似但也有差异的对象进行递归。我需要以一种独特的方式合并这两个对象,这样就没有重复的国家或型号等。
编辑:仅限香草js,请
var us1 = {
country: {
"United States": {
"Ford": {
"engine": {
type1: "4 cyl",
type2: "6 cyl"
}
},
"Chevy": {
"engine": {
type1: "6 cyl"
}
}
}
}
}
var us2 = {
country: {
"United States": {
"Ford": {
"engine": {
type3: "12 cyl"
}
},
"Saturn": {
"engine": {
type1: "4 cyl"
}
}
}
}
}
var cars = [us1, us2];
var newCars = [];
function fn(cars) {
if (typeof cars == "object") {
for (var attr in cars) {
if (!newCars.hasOwnProperty(cars[attr])) {
newCars.push(cars[attr]);
}
fn(cars[attr])
}
} else {
//
}
}
console.log(fn(cars));
console.log(newCars)
想要的结果:
var us1 = {
country: {
"United States": {
"Ford": {
"engine": {
type1: "4 cyl",
type2: "6 cyl",
type2: "12 cyl"
}
},
"Chevy": {
"engine": {
type1: "6 cyl"
}
},
"Saturn": {
"engine": {
type1: "4 cyl"
}
}
}
}
}
如果您不想使用库,那么编写自己的代码是很琐碎的。类似的东西
// (to: Object, ...sources: Object[]) => Object
function mergeDeep(to) {
const sources = Array.from(arguments).slice(1)
// (to: Object, from: Object) => void
const _merge = (to, from) => {
for (let a in from) {
if (a in to) {
_merge(to[a], from[a])
} else {
to[a] = from[a]
}
}
}
sources.forEach(from => {
_merge(to, from)
})
return to
}
请在此处查看演示https://tonicdev.com/bcherny/mergedeep
但实际上,你应该使用一个库来实现这一点。与任何广泛使用的现有实现相比,自己编写它肯定会更麻烦、更慢。
使用lodash:
_.merge(us1, us2)
如果您对使用underscore.js持开放态度,那么以下操作应该有效:
_.extend(us1, us2)
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 组合两个javascript函数
- Telerik rad组合框多列数据绑定
- 组合 2 个 JavaScript .scroll 函数
- 使用onkeyup JS事件检查输入的值是否唯一
- 如何使用jquery组合两个数组
- onChange不足以从Dojo组合框触发查询
- 当同一浏览器的两个实例浏览时,Javascript页面如何具有唯一的ID
- 在键值对的唯一组合上合并对象
- 不同对象之间的递归,并将它们唯一地组合在一起,不重复
- 具有唯一值的组合框中的 Jquery 自动完成功能
- extjs4.2组合框只显示存储的唯一条目
- 可以存在多少个唯一的jsbin-urlshortcode组合
- 具有唯一结果的两个数字组合的精简算法
- 查找数组的所有“唯一组合”
- 在jQuery中组合复选框选择器以获得唯一的结果
- JavaScript组合了三个2D数组,保持第一个值唯一
- 将n个数字组合成两个唯一的组