2017-09-28 36 views
0

我有兩個陣列這樣基於一個數組對象的鍵和其他數組對象的值創建一個更多的新數組?

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) 
    } 

輸出數組值不應該包含任何重複,我用於每個循環,是否有任何最佳做法來解決這個情況,如decresing循環,因爲上面的數組長度是somuch,如果我使用更多的循環它增加了加載時間,所以請讓我知道如何解決這個問題的巧妙

在此先感謝

回答

2

相當容易使用的標準mapfilterreduce

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);

1

首先讓我們篩選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);

+0

這裏設置的內容 – Runali

+0

https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Global_Objects/Set在ES5中,我們可能使用了對象字面值'{x:true,y:true}',但是使用SE T的你可以省略'真實的'..除此之外還有更多的東西,一個主要的優點是集合還可以存儲任何類型/值作爲關鍵。 – Keith

+0

這是可用的es6,因爲我使用es6,並獲得錯誤 – Runali

1
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/

相關問題