按键加入两个对象

时间:2016-10-07 06:27:05

标签: javascript ecmascript-6 lodash

我坚持将mergin 2个对象合二为一。让我们说我有2个对象数组: 一个是孩子:

let childsWithMoreInfo = [{
  id: 1,
  name: 'somename',
  parent: {
    id: 2
  },
}, {
  id: 2,
  name: 'some child name',
  parent: {
    id: 4
  }
}];

第二个是父母:

let parents = [{
  id: 1,
  parentName: 'The first',
  child: {}
}, {
  id: 2,
  parentName: 'The second',
  child: {}
}, {
  id: 3,
  parentName: 'The third',
  child: {}
}, {
  id: 4,
  parentName: 'The fourth',
  child: {}
}];

我想合并这些对象:

        let combined = [
            {
                id: 1,
                parentName: The first,
                child: {}
            },
            {
                id: 2,
                parentName: The second,
                child: {
                    id: 1,
                    name: somename,
                }
            },
            {
                id: 3,
                parentName: The third,
                child: {}
            },
            {
                id: 4,
                parentName: The fourth,
                child: {
                    id: 2
                    name: some child name,
                }
            },

        ]
        ];

所以基本上它应该是这样的:  let combinedList = parents.child = childsWithMoreInfo where parents.id = childsWithMoreInfo.parent.id。我应该看哪种方法?你有什么想法可以轻易实现吗?

5 个答案:

答案 0 :(得分:1)

我真的知道如何使用forEach,我想避免它。

这就是我所做的:

    this.combined = _.map(parents, (parent) => {
            parent.child = childs.find(child => child.parent.id === parent.id);
        return parent;
    });

感谢您的所有答案。

答案 1 :(得分:0)

您可以使用Map然后使用Array#forEach对每个对象进行迭代。

然后在地图中查找并将值分配给ch父对象。

var childsWithMoreInfo = [{ id: 1, name: 'somename', parent: { id: 2 } }, { id: 2, name: 'some child name', parent: { id: 4 } }],
    parents = [{ id: 1, parentName: 'The first', child: {} }, { id: 2, parentName: 'The second', child: {} }, { id: 3, parentName: 'The third', child: {} }, { id: 4, parentName: 'The fourth', child: {} }],
    map = new Map;

parents.forEach(p => map.set(p.id, p));
childsWithMoreInfo.forEach(c => {
    var o = map.get(c.parent.id);
    o.child = { id: c.id, name: c.name };
});
console.log(parents);
.as-console-wrapper { max-height: 100% !important; top: 0; }

另一种解决方案是使用Array#find

var childsWithMoreInfo = [{ id: 1, name: 'somename', parent: { id: 2 } }, { id: 2, name: 'some child name', parent: { id: 4 } }],
    parents = [{ id: 1, parentName: 'The first', child: {} }, { id: 2, parentName: 'The second', child: {} }, { id: 3, parentName: 'The third', child: {} }, { id: 4, parentName: 'The fourth', child: {} }];

childsWithMoreInfo.forEach(c => {
    var o = parents.find(p => p.id === c.parent.id);
    o.child = { id: c.id, name: c.name };
});
console.log(parents);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

以下代码有一些纯函数来完成您的任务。我也格式化/清理了输入对象:

'use strict';

let childsWithMoreInfo = [{
  id: 1,
  name: 'somename',
  parent: {
    id: 2
  },
}, {
  id: 2,
  name: 'some child name',
  parent: {
    id: 4
  }
}];

let parents = [{
  id: 1,
  parentName: 'The first',
  child: {}
}, {
  id: 2,
  parentName: 'The second',
  child: {}
}, {
  id: 3,
  parentName: 'The third',
  child: {}
}, {
  id: 4,
  parentName: 'The fourth',
  child: {}
}];

function makeObjectFromArray(arr) {
  let obj = {};
  arr.map(function(item) {
    if (obj[item.id] === undefined) {
      obj[item.id] = item
    }
  })
  return obj;
}

function toArray(obj) {
  return Object.keys(obj).map(function(key) {
    return obj[key]
  });
}

function sampleParentChildren(parent, children) {
  let Parent = {};
  if (parent.constructor === Array) {
    Parent = makeObjectFromArray(parent);
  } else {
    Parent = Object.assign({}, parent)
  }
  children.map(function(child) {
    if (Parent[child.parent.id] !== undefined) {
      if (Parent[child.parent.id].child === undefined) {
        Parent[child.parent.id].child = {};
      }
      Parent[child.parent.id].child[child.id] = child
    }

  });
  return Parent;
}
let resampledData = sampleParentChildren(parents, childsWithMoreInfo);
console.log(resampledData, toArray(resampledData));

答案 3 :(得分:0)

要在ES6中加入数组,您可以使用spread运算符来连接数组,只需使用普通的forEach进行重复数据删除即可。扩展运算符比在MDN上提到的here的Es5数组连接方法更具声明性

[...parents, ...childsWithMoreInfo]

这是一个有效的例子:

let childsWithMoreInfo = [{
    id: 1,
    name: 'somename',
    parent: {
      id: 2
    },
  }, {
    id: 2,
    name: 'some child name',
    parent: {
      id: 4
    }
  }],
  parents = [{
      id: 1,
      parentName: 'The first',
      child: {}
    }, {
      id: 2,
      parentName: 'The second',
      child: {}
    }, {
      id: 3,
      parentName: 'The third',
      child: {}
    }, {
      id: 4,
      parentName: 'The fourth',
      child: {}
    },

  ];

var conjoined = [...parents, ...childsWithMoreInfo];

conjoined.forEach(function(parentConjoinee, parentIndex) {
  conjoined.forEach(function(childConjoinee, childIndex) {
    if (parentConjoinee.id === childConjoinee.id && parentIndex !== childIndex) {
      conjoined.splice(childIndex, 1);
    }
  });
});

console.log(conjoined);

答案 4 :(得分:0)

您可以使用嵌套的for循环,break

var childsWithMoreInfo = [{
  id: 1,
  name: "somename",
  parent: {
    id: 2
  }
}, {
  id: 2,
  name: "some child name",
  parent: {
    id: 4
  }
}];

var parents = [{
    id: 1,
    parentName: "The first",
    child: {}
  }, {
    id: 2,
    parentName: "The second",
    child: {}
  }, {
    id: 3,
    parentName: "The third",
    child: {}
  }, {
    id: 4,
    parentName: "The fourth",
    child: {}
  }

];
let combined = [];
for (var i = 0; i < parents.length; i++) {
  for (var j = 0; j < childsWithMoreInfo.length; j++) {
    if (childsWithMoreInfo[j].parent.id === parents[i].id) {
      parents[i].child.id = childsWithMoreInfo[j].id;
      parents[i].child.name = childsWithMoreInfo[j].name;
      break;
    }
  }
  combined.push(parents[i])
};

console.log(combined);