[英]JAVASCRIPT - Get Value from Parent Array of Objects, inside the Child Object after Array Flattening
[英]Javascript flattening array inside an object
PS 我尝试了一些堆栈溢出,已经回答了有关在 object 中展平嵌套数组的问题,下面的问题中提到了它们。
我仍在努力清理阵列。 我设法使用以下方法填充空值和空值 arrays:
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'
}
由于命名,我删除其他嵌套 arrays 的唯一原因。 无论如何,我使用concat.apply()
从Stack Overflow 答案中尝试了以下解决方案:
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)
但它不起作用,因为它只能像这样在 arrays 上工作: [[1,2, 'abc'], ['x', True, 'z'], 11]
。
我尝试使用本文中的 Vanilla JavaScript 来做到这一点:
//Method 3: Vanilla JavaScript
console.log(this.array.flat())
但也没有结果。
我从这篇关于堆栈溢出的帖子中尝试了关于部分展平 object 的答案:
//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)
也没有结果。
这是一个堆栈闪电战,描述了所有 4 种方法的问题。
你可以试试这个:
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)
与其他答案非常相似,但使用map()
和传播语法来复制每个迭代的 object 以避免改变原始数组,并利用解构来删除地址属性,然后再将其属性应用于嵌套的 object 嵌套for...of
的循环。
const 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' }], },]; const flat_array = array.map(({ addresses, ...contact }) => { const _contact = {...contact }; let i = 1; for (const address_obj of addresses) { for (const address of Object.values(address_obj)) { _contact[`address_${i++}`] = address; } } return _contact; }); console.log(flat_array);
或者在flatMap()
ed 地址数组上调用Object.fromEntries()
并使用Object.assign()
将其与原始联系人复制/合并的稍微模糊的解决方案
const 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' }], },]; const flat_array = array.map(({ addresses, ...contact }) => { let i = 1; const address_object = Object.fromEntries( addresses.flatMap((o) => Object.values(o).map((v) => [`address_${i++}`, v])) ); return Object.assign({}, contact, address_object); }); console.log(flat_array);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.