P.S。我尝试了一些堆栈溢出,已经解决了有关扁平化对象内部嵌套数组的问题,这些问题在下面的问题中提到。
我仍在清洁阵列。我设法使用以下方法填充空值和空值数组:
if (Array.isArray(elem[prop]) || typeof(elem[prop]) === 'object') {
if (elem[prop].indexOf(null) !== -1 || elem[prop].length === 0) {
// console.log(elem[prop], prop)
elem[prop] = '';
}
}
假设我有以下数组:
array = [
{
id: 123,
name: 'Peter',
phone: '',
addresses:
[
{
address1: 'Manchester, UK', address2: 'London, UK'
},
{
address1: 'Liverpool, UK', address2: 'NY, USA'
}
]
},
{
id: 124,
name: 'Sara',
phone: '',
addresses: [{ address1: 'London, UK', address2: 'Paris, FR' }]
}
];
我需要展平地址数组,因此最终的数组将如下所示:
array = [
{
id: 123,
name: 'Peter',
phone: '',
addresses_address1: 'Manchester, UK',
addresses_address2: 'London, UK'
},
{
id: 124,
name: 'Sara',
phone: '',
addresses_address1: 'London, UK',
addresses_address2: 'Paris, FR'
}
];
您说过,用户ID = 123的第一个嵌套数组被添加为addresses_addres1
和addresses_address2
,而第二个嵌套数组已被删除:
{
address1: 'Liverpool, UK', address2: 'NY, USA'
}
由于命名,我删除其他嵌套数组的唯一原因。无论如何,我使用concat.apply()
从Stack Overflow answer尝试了以下解决方案:
ngOnInit(){
let props = [];
var flattened = [];
// Getting the properties of the array
props = Array.from(new Set(this.array.flatMap(e => Object.keys(e), [])));
// console.log(props)
for (const elem of this.array){
for (const prop of props) {
if(Array.isArray(elem[prop])){
flattened = [].concat.apply([],this.array);
}
}
}
console.log(flattened)
}
但是控制台阵列与原始阵列相同。
然后我尝试使用lodash
:
// Method 2 using lodash
for (const elem of this.array) {
for (const prop of props) {
if (Array.isArray(elem[prop])) {
elem[prop] = _.flatten(elem[prop])
}
}
}
console.log(this.array)
但是它没有用,因为它只能在像[[1,2, 'abc'], ['x', True, 'z'], 11]
这样的数组上工作。
我尝试使用此article中的Vanilla JavaScript来做到这一点:
//Method 3: Vanilla JavaScript
console.log(this.array.flat())
但也没有结果。
我尝试了this post在堆栈溢出时有关部分展平对象的答案:
//Method 4:
for (const elem of this.array) {
for (const prop of props) {
if (Array.isArray(elem[prop])) {
const result = elem[prop].map(
({prop, ...rest}) => Object.assign(rest, ...Object.keys(prop).map(key => {[elem[prop]+"_"+prop] : elem[prop]})));
}
}
}
console.log(this.array)
也没有结果。
这里是stackblitz,描述了所有4种方法的问题。
答案 0 :(得分:1)
您可以尝试以下方法:
array = [
{
id: 123,
name: 'Peter',
phone: '',
addresses:
[{address1: 'Manchester, UK', address2: 'London, UK'}, { address1: 'Liverpool, UK', address2: 'NY, USA' }]
},
{
id: 124,
name: 'Sara',
phone: '',
addresses: [{ address1: 'London, UK', address2: 'Paris, FR' }]
}
];
let count = [];
array.map(a => {
a.addresses.map(b => {
Object.keys(b).map((c, ind) => {
count.push(1)
a[c.slice(0, -1) + count.length] = Object.values(b)[ind]
})
})
count = []
delete a.addresses;
})
console.log(array)