Javascript 嵌套或非嵌套数组
我有一个像这样的对象数组Javascript 嵌套或非嵌套数组,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我有一个像这样的对象数组 var arr = [{'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 1' ,'parentid' : 21}, {'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 2' ,'parentid' : 21}, {'id':22 ,'name' : 'name 2' ,'vehiclename' : 'vehicl
var arr = [{'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 1' ,'parentid' : 21},
{'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 2' ,'parentid' : 21},
{'id':22 ,'name' : 'name 2' ,'vehiclename' : 'vehicle 1' ,'parentid' : 22},
{'id':22 ,'name' : 'name 2' ,'vehiclename' : 'vehicle 2' ,'parentid' : 22}]
var arr = [{'id':21,
name: 'name 1'
vehicles : [{'vehiclename':'vehicle 1','parentid':21},
{'vehiclename':'vehicle 2','parentid':21}] },
{'id':22,
name: 'name 2'
vehicles : [{'vehiclename':'vehicle 1','parentid':22},
{'vehiclename':'vehicle 2','parentid':22}] }
}]
我想将数组展开或分组,使其看起来像这样
var arr = [{'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 1' ,'parentid' : 21},
{'id':21 ,'name' : 'name 1' ,'vehiclename' : 'vehicle 2' ,'parentid' : 21},
{'id':22 ,'name' : 'name 2' ,'vehiclename' : 'vehicle 1' ,'parentid' : 22},
{'id':22 ,'name' : 'name 2' ,'vehiclename' : 'vehicle 2' ,'parentid' : 22}]
var arr = [{'id':21,
name: 'name 1'
vehicles : [{'vehiclename':'vehicle 1','parentid':21},
{'vehiclename':'vehicle 2','parentid':21}] },
{'id':22,
name: 'name 2'
vehicles : [{'vehiclename':'vehicle 1','parentid':22},
{'vehiclename':'vehicle 2','parentid':22}] }
}]
如果有任何帮助,我们将不胜感激。您已经用“下划线.js”标记了您的问题,我相信下划线会使这更容易,但由于我不熟悉,这里有一个解决方案使用:
var-working={},
输出=[],
身份证件
我
对于(i=0;i
我没有直接生成新的
输出
数组,而是从一个工作
对象开始,这样就很容易测试给定的id
是否已被看到。然后,我将工作对象中的每个项目放入实际数组中。您已将问题标记为“下划线.js”,我相信下划线会使这更容易,但由于我不熟悉它,这里有一个解决方案使用:
var-working={},
输出=[],
身份证件
我
对于(i=0;i
我没有直接生成新的输出
数组,而是从一个工作
对象开始,这样就很容易测试给定的id
是否已被看到。然后我将工作
对象中的每个项放入实际数组中。对于那些好奇的人,这里有一个下划线解决方案:
grouped = _.map(_.groupBy(arr, 'id'), function(b) {
return _.extend(_.pick(b[0], 'id', 'name'), {
vehicles: _.map(b, function(elem) {
return _.pick(elem, 'vehiclename', 'parentid')
})
});
});
对于那些好奇的人,这里有一个下划线解决方案:
grouped = _.map(_.groupBy(arr, 'id'), function(b) {
return _.extend(_.pick(b[0], 'id', 'name'), {
vehicles: _.map(b, function(elem) {
return _.pick(elem, 'vehiclename', 'parentid')
})
});
});
我试图让它更具可配置性,看起来不像给定的解决方案那么好,但它自己决定一个属性是否应该是最终对象中的数组,还允许将键配置为映射到最终对象中的某个键,这可能对更一般的情况有所帮助
var _ = require("underscore")
var res = []
var arr = [
{'id':21 ,'name' : 'name1' ,'vehiclename' : 'vehicle1' ,'parentid' : 21},
{'id':21 ,'name' : 'name1' ,'vehiclename' : 'vehicle2' ,'parentid' : 21},
{'id':22 ,'name' : 'name2' ,'vehiclename' : 'vehicle1' ,'parentid' : 22},
{'id':22 ,'name' : 'name2' ,'vehiclename' : 'vehicle2' ,'parentid' : 22},
]
var connected = [{
name: "vehicles",
props: [ "vehiclename", "parentid" ]
}]
arr.forEach(function(e) {
var obj = _.findWhere(res, { id: e.id })
if(!obj) {
obj = { id: e.id }
res.push(obj)
}
var props = _.omit(e, "id");
connected.forEach(function(cp) {
props = _.omit.apply(this, [props, cp.props])
})
for(p in props) {
copyPropToObj(props[p], p, obj);
}
connected.forEach(function(cp) {
copyPropToObj(_.pick.apply(this, [e, cp.props]), cp.name, obj)
})
})
function copyPropToObj(prop, propName, obj) {
var oProp = _.clone(obj[propName])
if(oProp && (prop === oProp)) {
return
} else if(oProp) {
// we already have a value, need to move to an array
obj[propName] = []
obj[propName].push(prop)
obj[propName].push(oProp)
} else {
// we don't have it set yet so just copy over
obj[propName] = prop
}
}
res.forEach(function(e) {
console.log(e)
})
我试着让它更具可配置性,看起来不像给定的解决方案那么好,但它自己决定一个属性是否应该是最终对象中的数组,还允许配置键以映射到最终对象中的某个键,也许这对更一般的情况有帮助
var _ = require("underscore")
var res = []
var arr = [
{'id':21 ,'name' : 'name1' ,'vehiclename' : 'vehicle1' ,'parentid' : 21},
{'id':21 ,'name' : 'name1' ,'vehiclename' : 'vehicle2' ,'parentid' : 21},
{'id':22 ,'name' : 'name2' ,'vehiclename' : 'vehicle1' ,'parentid' : 22},
{'id':22 ,'name' : 'name2' ,'vehiclename' : 'vehicle2' ,'parentid' : 22},
]
var connected = [{
name: "vehicles",
props: [ "vehiclename", "parentid" ]
}]
arr.forEach(function(e) {
var obj = _.findWhere(res, { id: e.id })
if(!obj) {
obj = { id: e.id }
res.push(obj)
}
var props = _.omit(e, "id");
connected.forEach(function(cp) {
props = _.omit.apply(this, [props, cp.props])
})
for(p in props) {
copyPropToObj(props[p], p, obj);
}
connected.forEach(function(cp) {
copyPropToObj(_.pick.apply(this, [e, cp.props]), cp.name, obj)
})
})
function copyPropToObj(prop, propName, obj) {
var oProp = _.clone(obj[propName])
if(oProp && (prop === oProp)) {
return
} else if(oProp) {
// we already have a value, need to move to an array
obj[propName] = []
obj[propName].push(prop)
obj[propName].push(oProp)
} else {
// we don't have it set yet so just copy over
obj[propName] = prop
}
}
res.forEach(function(e) {
console.log(e)
})
到目前为止,请发布您的代码,您尝试了什么?你遇到了什么问题?你能发布一个现场演示吗?我想你必须编写一个循环,将它们引入到一个新的数组中。请注意,这个问题与JSON没有任何关系。您似乎混淆了JavaScript对象/数组文本(JavaScript语言语法的结构)和JSON(一种与语言无关的数据交换格式,如XML或CSV)。我将相应地编辑您的问题。另请参见:。感谢Felix,我对这些技术非常陌生。@elclanrs我还没有尝试过任何东西。我希望有一个正确的方向。请发布你的代码到目前为止,你尝试了什么?你遇到了什么问题?你能发布一个现场演示吗?我想你必须编写一个循环,将它们引入到一个新的数组中。请注意,这个问题与JSON没有任何关系。您似乎混淆了JavaScript对象/数组文本(JavaScript语言语法的结构)和JSON(一种与语言无关的数据交换格式,如XML或CSV)。我将相应地编辑您的问题。另请参见:。感谢Felix,我对这些技术非常陌生。@elclanrs我还没有尝试过任何东西。希望有一个方向正确的点。elegent解决方案使用下划线。我现在有一个情况,车辆数组中添加了一个重复的车辆,是否有办法检查车辆是否在子数组中。@StantonRoux:这是否意味着源数组包含两个相同的元素?是的,我正在尝试解决该问题,但是,它可能会发生,并且希望检查that@StantonRoux:在处理之前尝试应用于源。elegent解决方案使用下划线。我现在遇到一种情况,即车辆数组中添加了一个重复的车辆,是否有任何方法可以检查车辆是否在子数组中。@StantonRoux:这是否意味着源数组包含两个相同的元素?是的,我正在尝试解决该问题,但可能会发生这种情况,并且希望检查是否存在此问题that@StantonRoux:在处理源之前尝试应用它。