对象内部的Javascript展平数组

时间:2020-04-07 09:26:11

标签: javascript arrays typescript lodash flatten

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_addres1addresses_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种方法的问题。

1 个答案:

答案 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)

相关问题