我有JSON数组,如下所示:
[{
'a': 1,
'b': 10,
'aa': { 'a': 11, 'ab': 110 }
}, {
'a': 2,
'b': 20,
'aa': { 'a': 22, 'ab': 220 }
}, {
'a': 3,
'b': 30,
'aa': { 'a': 33, 'ab': 330 }
}, ...]
修改 这里提到的数组是动态的。并且它可能具有比此处指定的更多或更少的元素。
使用Underscore
,我想展平这个数组,以便我可以得到低于输出:
[{ 'a': 1},
{ 'a': 11 },
{ 'a': 2 },
{ 'a': 22 },
{ 'a': 3 },
{ 'a': 33 }]
答案 0 :(得分:3)
我在UnderscoreJS中找不到合适的方法,因为使用简单的数组展平是无法实现的。
你可以用这样的普通JavaScript做到这一点:
const source = [{
'a': 1,
'b': 10,
'aa': { 'a': 11, 'ab': 110 }
}, {
'a': 2,
'b': 20,
'aa': { 'a': 22, 'ab': 220 }
}, {
'a': 3,
'b': 30,
'aa': { 'a': 33, 'ab': 330 }
}];
const result = source.reduce((acc, item) => {
acc.push({a: item.a});
acc.push({a: item.aa.a});
return acc;
}, []);
console.log(result);
答案 1 :(得分:2)
如果vanilla JS没问题,我会使用reduce
:
const input = [{
'a': 1,
'b': 10,
'aa': { 'a': 11, 'ab': 110 }
}, {
'a': 2,
'b': 20,
'aa': { 'a': 22, 'ab': 220 }
}, {
'a': 3,
'b': 30,
'aa': { 'a': 33, 'ab': 330 }
}];
const output = input.reduce(
(arr, { a: a1, aa: { a: a2 }}) => [...arr, { a: a1 }, { a: a2 }],
[]
);
console.log(output);

答案 2 :(得分:1)
不确定下划线,但使用vanilla javascript,您可以创建一个函数,以递归方式深入查找寻找特定键的对象。然后,您可以使用$(document).ready(function() {
var isMobile = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
if (isMobile) {
// User-Agent is IPhone, IPod, IPad, Android or BlackBerry
document.location.href = 'http://m.domain.co.uk';
} else {
document.location.href = 'https://domain.co.uk';
}
});
在数组中的每个项目上调用该函数。这样的事情应该是一个好的开始,应该适用于任意嵌套的对象:
reduce()

你也可以将它合并为一个let arr = [{'a': 1,'b': 10,'aa': { 'a': 11, 'ab': 110 }}, {'a': 2,'b': 20,'aa': { 'a': 22, 'ab': 220 }}, {'a': 3,'b': 30,'aa': { 'a': 33, 'ab': 330 }}]
function getAll(obj, key, arr = []) {
Object.entries(obj).forEach(([k, v]) => {
if (k === key) arr.push({[k]:v})
else if (typeof v === 'object') getAll(v, key, arr)
})
return arr
}
let key = 'a'
let ret = arr.reduce((a, c) => a.concat(getAll(c, key)), [])
console.log(ret)
,但它可能会开始变得有点难以理解:
reduce()

答案 3 :(得分:1)
这是一个递归解决方案,它使用Object.entries()
和Array.forEach()
来迭代嵌套对象的键和值(条目)。如果找到密钥,则将其条目添加到结果中。如果值是数组或对象(除非它是我们正在寻找的键),则迭代该值,并继续搜索。
const source = [{
'a': 1,
'b': 10,
'aa': { 'a': 11, 'ab': 110 }
}, {
'a': 2,
'b': 20,
'aa': { 'a': 22, 'ab': 220 }
}, {
'a': 3,
'b': 30,
'aa': { 'a': 33, 'ab': { 'a': 500 } } // added another nested 'a'
}];
const getKey = (src, key) => {
const result = [];
const inner = (src) =>
Object.entries(src)
.forEach(([k, v]) => {
if(k === key) result.push({ [k]: v });
else if(v && typeof v === 'object') inner(v);
});
inner(src);
return result;
}
console.log(getKey(source, 'a'));