【问题标题】:JavaScript: Get non-repeating items from 2d array of objectsJavaScript:从二维对象数组中获取非重复项
【发布时间】:2021-12-27 11:35:38
【问题描述】:

比较二维对象数组,并通过使用 Javascript 获取唯一项(在 id 方面不重复)将其转换为单个对象数组。

示例输入:

const data = [
  [ { name: 'x', id: 1 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ],
  [ { name: 'y', id: 12 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ],
  [ { name: 'z', id: 22 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ]
];

预期输出:

const out = [
  { name: 'a', id: 1 }, 
  { name: 'b', id: 12 }, 
  { name: 'b', id: 22 }
]

【问题讨论】:

  • 提供的输出与输入不匹配。为输入和输出提供正确的数据集。还请提及您到目前为止所做的尝试。
  • 换种说法,没有一种明显的方式可以从您的输入到您的输出,目前尚不清楚您要在这里做什么

标签: javascript arrays


【解决方案1】:
  • 使用Array#flat,将二维数组转换为1
  • 使用Array#reduce,迭代后者,同时更新Map,其中id是key,计数是value
  • 使用Map#entries,从 Map 中获取 id-count 对的列表。然后,使用Array#filter,得到计数为1的id。最后,使用Array#map,得到得到的id列表
  • 使用Array#filter,遍历展平的对象数组并返回其id属于非重复id列表的元素

const data = [
  [ { name: 'x', id: 1 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ],
  [ { name: 'y', id: 12 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ],
  [ { name: 'z', id: 22 }, { name: 'a', id: 13 }, { name: 'a', id: 14 }, { name: 'a', id: 15 }, { name: 'a', id: 16 } ]
];

const arr = data.flat();
const idCountMap = arr.reduce((map, { id }) => map.set(id, (map.get(id) ?? 0) + 1), new Map);
const nonRepeatingIds = 
  [...idCountMap.entries()]
  .filter(([ id, count ]) => count === 1)
  .map(([ id ]) => id);
const nonRepeatingItems = arr.filter(({ id }) => nonRepeatingIds.includes(id));

console.log(nonRepeatingItems);

【讨论】:

    【解决方案2】:

    您可以通过将用例分成两部分来做到这一点。

    第 1 部分:将对象数组连接到新数组

    var array = [];
    data.forEach(val => {
        array = [...array, ...val];
    });
    

    第 2 部分:查找新数组中的唯一值

    const result = [];
    const map = new Map();
    for (const item of array) {
        if(!map.has(item.id)){
            map.set(item.id, true);    // set any value to Map
            result.push({
                id: item.id,
                name: item.name
            });
        }
    }
    console.log(result)
    

    【讨论】:

      【解决方案3】:

      你必须循环数组并检查你是否已经添加了 id。通过这种方式,您可以使 id 在结果中唯一

      const data= [
      [{name:"x" , id:1},{name:"a" , id:13},{name:"a" , id:14},{name:"a" , id:15},{name:"a" , id:16},],
      [{name:"x" , id:1},{name:"a" , id:13},{name:"a" , id:14},{name:"a" , id:15},{name:"a" , id:16},],
      [{name:"x" , id:1},{name:"a" , id:13},{name:"a" , id:14},{name:"a" , id:15},{name:"a" , id:16},]
      ]
      
      //loop for each array and filter
      var addedId = [];
      
      
      //init result
      var out = [];
      
      
      //loop array
      data.forEach(function(arr){
        //loop element in array
        arr.forEach(function(obj){
            // check if the id has been already added to the result
            if(!addedId.includes(obj.id)){
              addedId.push (obj.id);
              out.push(obj); 
            }
        })
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 2013-01-08
        • 2019-05-11
        相关资源
        最近更新 更多