Javascript / Lodash - 在数组数组中获取唯一值

时间:2018-02-03 17:48:22

标签: javascript lodash

我遇到一个复杂的情况,我需要在数组数组中有唯一的值。

这就是我现在所拥有的:

var ar = [{
"theFirstArray": [
    [{
        "no": 1
    }, {
        "no": 2
    }, {
        "no": 3
    }, {
        "no": 4
    }, {
        "no": 11
    }]
],

    "theSecondArray": [{
        "no": 3
    },
    {
        "no": 1
    },
    {
        "no": 4
    },
    {
        "no": 9
    },
    {
        "no": 39
    },
    {
        "no": 18
    },
    {
        "no": 19
    }
],

    "theThirdArray": [{
        "no": 20
    }, {
        "no": 12
    }, {
        "no": 10
    }, {
        "no": 9
    }, {
        "no": 16
    }]
  }]

我需要实现的目标:

[{
"theFirstArray":[{"no":1},{"no":2},{"no":3},{"no":4}]
},{
"theSecondArray":[{"no":9}, {"no":39}, {"no":18}, {"no":19}]
},{
"theThirdArray":[{"no":20},{"no":12},{"no":10},{"no":16}]
}]

PS。请注意,我只需要在每个子数组中输出4个值,并且所有数组中的值都不会重复。

我已经尝试了以下内容:

_.uniqBy(ar, 'no');

确实,我只得到结果中的唯一值;但是,我无法获得与以下相同的通缉结构:

[{
 theFirstArray:[{"no":1,"no":2,"no":3,"no":4, "no":9, "no":39, "no":18,   "no":19, "no":20,"no":12,"no":10,"no":16}]
}]

我也曾尝试使用_.map,但这并没有奏效!

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

userApp.delete()

从我假设的例子中,你在对象中只有一个键。

如果在每个数组(包含{no:1}之类的对象的数组)中总是有唯一值,那么你可以脱离线: function getUniqueArrays(arr) { var uniqAr = []; var allArr = [{ no: null }]; arr.forEach(function(item) { var itemKey = Object.keys(item)[0]; var itemArr = _.uniqBy(item[itemKey], 'no'); var itemArr = _.differenceBy(itemArr, allArr, 'no').slice(0, 4); allArr = itemArr.concat(allArr); var newItem = {}; newItem[itemKey] = itemArr; uniqAr.push(newItem); }) return uniqAr; }

答案 1 :(得分:0)

Lodash所有的东西!您可以使用reduce存储已经看到的值并使用uniqBy清除它们,并且只为每个循环周期获取differenceBy所需的值。

以下是它的外观:

_.map(items, item => _.reduce(
  _.toPairs(item),
  ({ seenValues, result }, [key, values]) => ({
    seenValues: _.uniqBy([...seenValues, ...values], 'no'),
    result: {
      ...result,
      [key]: _.take(_.differenceBy(values, seenValues, 'no'), 4)
    }
  }),
  { seenValues: [], result: {} }
));

我们使用toPairs在reduce函数中包含解压缩的keyvalue,因此我们可以重新构建所需的结构。

最后,你可以获得result财产。请查看此jsbin:http://jsbin.com/tikoyehapi/1/edit?js,console了解更多信息。