繁体   English   中英

根据一个数组对象键和其他数组对象值创建另一个新数组?

[英]Based on one array object keys and other array object values create one more new array?

我有两个这样的数组

    arr1 = [  
   {  
      'name':'Victoria Cantrell',
      'position':'Integer Corporation',
      'office':'Croatia',
      'ext':'0839',
      'startDate':'2015-08-19',
      'salary':208.178
   },
   {  
      'name':'Pearleeee',
      'position':'In PC',
      'office':'Cambodia',
      'ext':'8262',
      'startDate':'2014-10-08',
      'salary':114.367
   },
   {  
      'name':'Pearl Crosby',
      'position':'Integer',
      'office':'Cambodia',
      'ext':'8162',
      'startDate':'2014-10-08',
      'salary':114.367
   }
]

arr2 = 

[{
  'name': 'name',
  'checkfilter': false
},
{
  'name': 'position',
  'checkfilter': true
},
{
  'name': 'office',
  'checkfilter': true
},
{
  'name': 'startDate',
  'checkfilter': false
},
{
  'name': 'ext',
  'checkfilter': false
},
{
  'name': 'salary',
  'checkfilter': false
}]

基于checkfilter == true我想产生这样的第三个数组

arr3 =`

[{
  name: 'position',
  values: [{
    checkName: 'Integer Corporation'

  },
  {
    checkName: 'In PC'

  },
  {
    checkName: 'Integer'

  }]
},

{ 
 name:'office',
  values: [{
    checkName: 'Croatia'

  },
  {
    checkName: 'Cambodia'

  }]
}
]

`我试图解决这种情况,但效果不理想

    arr3=[]
      this.arr2.forEach((column: any) => {
      if (column.ischeckFilter === true) {
        this.arr3.push({
          name: column.name,
          values: []
        });
      }
    });

 this.arr1.forEach((d: any) => {
      this.arr2.forEach((column: any) => {
        if (column.ischeckFilter === true) {
        this.arr3.forEach((c: any) => {
         // console.log(d[column.name], c.name, 'JJJJ');
         // console.log(Object.keys(d), 'BBBBBBBBB');
          let keys = Object.keys(d);
          keys.forEach((k: any) => {
            if (k === c.name) {
              if (find( c.values, { 'checkName': d[column.name]}) === undefined) {
                c.values.push({
                  checkName: d[column.name] ,
                  ischeck: false
                });
              }

            }
          });

      });
    }
      });
    });
    console.log( this.arr3)
  }

输出数组值不应包含任何重复项,我在每个循环中都使用过,是否有解决此情况的最佳实践,例如减少循环数,因为上述数组长度很大,如果我使用更多循环,则会增加加载时间,所以请让我知道如何聪明地解决这个问题

提前致谢

使用标准map相当容易, filterreduce

 var arr1 = [{ 'name':'Victoria Cantrell', 'position':'Integer Corporation', 'office':'Croatia', 'ext':'0839', 'startDate':'2015-08-19', 'salary':208.178 }, { 'name':'Pearleeee', 'position':'In PC', 'office':'Cambodia', 'ext':'8262', 'startDate':'2014-10-08', 'salary':114.367 }, { 'name':'Pearl Crosby', 'position':'Integer', 'office':'Cambodia', 'ext':'8162', 'startDate':'2014-10-08', 'salary':114.367 }]; const arr2 = [{ 'name': 'name', 'checkfilter': false },{ 'name': 'position', 'checkfilter': true },{ 'name': 'office', 'checkfilter': true },{ 'name': 'startDate', 'checkfilter': false },{ 'name': 'ext', 'checkfilter': false },{ 'name': 'salary', 'checkfilter': false }]; const isDuplicate = (arr, name) => !arr.find(({ checkname }) => checkname === name); const arr3 = arr2 .filter(({ checkfilter }) => checkfilter) .map(({ name }) => ({ name: name, values: arr1.reduce((names, item) => isDuplicate(names, item[name]) ? [...names, { checkname: item[name] } ] : names, []) })); console.log(arr3); 

首先让我们过滤arr2。

var x = arr2.filter((r) => r.checkfilter).

我们的名字被映射..

map((r) => ({name:r.name, 

获取我们的匹配值。并删除重复项。

values:([...new Set(arr1.map((x) => (x[r.name])))]).

最终重新映射,所以我们得到{checkName: ?}

map((r) => ({checkName:r}))

让我们不要忘记关闭括号和内容。

}));

 const arr1 = [ { 'name':'Victoria Cantrell', 'position':'Integer Corporation', 'office':'Croatia', 'ext':'0839', 'startDate':'2015-08-19', 'salary':208.178 }, { 'name':'Pearleeee', 'position':'In PC', 'office':'Cambodia', 'ext':'8262', 'startDate':'2014-10-08', 'salary':114.367 }, { 'name':'Pearl Crosby', 'position':'Integer', 'office':'Cambodia', 'ext':'8162', 'startDate':'2014-10-08', 'salary':114.367 } ]; const arr2 = [{ 'name': 'name', 'checkfilter': false }, { 'name': 'position', 'checkfilter': true }, { 'name': 'office', 'checkfilter': true }, { 'name': 'startDate', 'checkfilter': false }, { 'name': 'ext', 'checkfilter': false }, { 'name': 'salary', 'checkfilter': false }]; var x = arr2.filter((r) => r.checkfilter). map((r) => ({name:r.name, values:([...new Set(arr1.map((x) => (x[r.name])))]). map((r) => ({checkName:r})) })); console.log(x); 

function createArr3(target, source) {
    for (var prop in source) {
        if (source[prop]["checkfilter"]) {
            var newArr3Element = {};
            newArr3Element.name = source[prop].name;
            newArr3Element.values = [];
            target.forEach(function(element) {
                if (newArr3Element.values.indexOf(element[source[prop].name]) < 0){
                    newArr3Element.values.push(element[source[prop].name]);
                }
            });
            arr3.push(newArr3Element);
        }
    }    
    console.log(arr3);
}

https://jsfiddle.net/x6140nct/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM