UnderscoreJS - 如何拼合嵌套属性

时间:2018-04-25 04:42:30

标签: javascript underscore.js

我有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 }]

4 个答案:

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