【问题标题】:Separate objects in array and sort by id in new array for each id分隔数组中的对象并按每个 id 的新数组中的 id 排序
【发布时间】:2017-07-28 20:01:25
【问题描述】:

我有一个包含对象的数组,每个对象都有一个唯一的 ID。我需要根据它们的 ID 将这些对象分开,并创建包含仅具有相同 ID 的对象的新数组。

这是我目前所拥有的..

let fullArray = [{
  name: 'John',
  id: 1
}, {
  name: 'Lucy',
  id: 1
}, {
  name: 'Tyler',
  id: 2
}];

function separateObjectsInArray(fullArray) {

  let newArr = [];

  fullArray.map((each) => {

    newArr.push(each.id);

  });

  let uniqueIdArr = [...new Set(newArr)];

  fullArray.map((eachObj) => {

    uniqueArr.map((uniqueId) => {

      if (eachObj.id === uniqueId) {
         //CREATE NEW ARRAYS WITH MATCHING ID'S

      }

    })

  })

}

separateObjectsInArray(fullArray);

如您所见,我首先绘制出对象数组,然后使用 id 创建一个数组,然后取出所有重复项 (uniqueIdArr) 之后我再次映射 fullArray 并将每个对象的 ID 与 ID 的 uniqueIdArr 进行比较。我不知道如何告诉它为每个 ID 创建一个数组并推送匹配的对象。

let finalArray1 = [{
  name: 'John',
  id: 1
}, {
  name: 'Lucy',
  id: 1
}];

let finalArray2 = [{
  name: 'Tyler',
  id: 2
}];

或者甚至一个带有数组的数组也可以!

let finalArray = [[{name: 'Tyler', id: 2 }], [{ name: 'John', id: 1},{ 
name: 'Lucy', id: 1 }]];

【问题讨论】:

  • sortedArr = finalArray.sort(function(a,b) { return b.id-a.id});
  • 我有一个包含对象的数组,每个对象都有一个唯一的 ID,然后创建包含只有相同 ID 的对象的新数组 - 一个这些东西不像其他的:)

标签: javascript arrays object filter higher-order-functions


【解决方案1】:

您可以使用reduce 构建一个以id 为键的 Map,最后从该数组中取出值以形成一个新的数组数组:

function group(arr, key) {
    return [...arr.reduce( (acc, o) => 
        acc.set(o[key], (acc.get(o[key]) || []).concat(o))
    , new Map).values()];
}

const fullArray = [{
  name: 'John',
  id: 1
}, {
  name: 'Lucy',
  id: 1
}, {
  name: 'Tyler',
  id: 2
}];

const result = group(fullArray, 'id');

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    如果你可以使用lodash,这里有另一种解决方案。

    let fullArray = [
        { name: 'John', id: 1 },
        { name: 'Sarah', id: 2 },
        { name: 'Lucy', id: 1 },
        { name: 'Tyler', id: 2 }];
    
    const grouped = _.groupBy(fullArray, "id");
    console.log(Object.keys(grouped).map((key) => grouped[key]));
    <script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2018-04-21
      • 2021-10-14
      • 2021-11-19
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多