【问题标题】:convert array of array of objects into single array of objects in lodash将对象数组的数组转换为lodash中的单个对象数组
【发布时间】:2018-05-22 14:07:36
【问题描述】:

我有一个如下的对象数组,由_.filter lodash 函数生成,该函数返回匹配值的 objects:

const matchedPositions = _.filter(allPositions, function(o) {
return o.company.toLowerCase() === value.toLowerCase();
});//matchedPositions have array of objects
let allCheckboxFiltered = [...allCheckboxFiltered, matchedPositions]; //allCheckboxFiltered  have below results

   [
    [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}],
    [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}]
    ];

我想要如下预期的结果;

[
{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}
];

我已尝试使用reduce 函数来生成如下预期结果:

let result = temp1.reduce(function(res, obj) {
console.log(res, obj);
Object.keys(obj).forEach(function(k) {
res[k] = res[k] || [];
res[k] = res[k].concat(obj[k]);
});
return res;
}, []);

上面的代码没有生成结果,我想要。我尝试过其他东西,例如lodash 也能正常工作,但都是徒劳的。

谢谢

【问题讨论】:

  • 第一个数组是怎么得到的?不能从源头改吗?

标签: javascript jquery arrays lodash


【解决方案1】:

使用 Lodash 库 _.flattenDeep

let allCheckboxFiltered = [
    [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}],
    [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
    {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}]
    ];

allCheckboxFiltered = _.flattenDeep(allCheckboxFiltered);

【讨论】:

    【解决方案2】:

    只需使用下面的 Lodash 函数

    _.flattenDeep(temp1);
    

    【讨论】:

      【解决方案3】:

      你为什么不直接使用 lodash flatten https://lodash.com/docs/4.17.4#flatten

      【讨论】:

        【解决方案4】:

        你可以像下面这样使用reduce:

        var temp1 = [
        [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}],
        [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}]
        ];
        
        var result= temp1.reduce((o, m) => m.concat(o), []);
        console.log(result);

        如果您想使用更多 ES6 功能:

        var temp1 = [
        [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}],
        [{serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"},
        {serialNo: 9, sector: null, company: "AMERICAN LIFE INSURANCE COMPANY", location: null, position: "INSURANCE Operations  MANAGER"}]
        ];
        
        var result= temp1.reduce((o, m) => [...m, ...o], []);
        console.log(result);

        【讨论】:

          【解决方案5】:

          您可以使用Array.concat 来展开内部数组。

          var temp1 = [
            [{
                serialNo: 9,
                sector: null,
                company: "AMERICAN LIFE INSURANCE COMPANY",
                location: null,
                position: "INSURANCE Operations  MANAGER"
              },
              {
                serialNo: 9,
                sector: null,
                company: "AMERICAN LIFE INSURANCE COMPANY",
                location: null,
                position: "INSURANCE Operations  MANAGER"
              }
            ],
            [{
                serialNo: 9,
                sector: null,
                company: "AMERICAN LIFE INSURANCE COMPANY",
                location: null,
                position: "INSURANCE Operations  MANAGER"
              },
              {
                serialNo: 9,
                sector: null,
                company: "AMERICAN LIFE INSURANCE COMPANY",
                location: null,
                position: "INSURANCE Operations  MANAGER"
              },
              {
                serialNo: 9,
                sector: null,
                company: "AMERICAN LIFE INSURANCE COMPANY",
                location: null,
                position: "INSURANCE Operations  MANAGER"
              }
            ]
          ];
          
          const result = temp1.reduce((res, currentArr) => res.concat(currentArr), [])
          console.log(result);

          【讨论】:

            【解决方案6】:

            您可以使用reduce

            var output = temp1.reduce( (a,b) => (a = a.concat(b), a) ,[] ) ;
            

            或者干脆

            var output = temp1.reduce( (a,b) => a.concat(b) ,[] ) ;
            

            【讨论】:

              猜你喜欢
              • 2016-08-06
              • 1970-01-01
              • 2017-03-30
              • 1970-01-01
              • 2015-07-25
              • 1970-01-01
              • 2019-04-18
              • 2019-02-12
              相关资源
              最近更新 更多