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:在处理源之前尝试应用它。