使用lodash提取混合对象/数组的叶子

时间:2016-08-24 16:44:07

标签: javascript lodash

var a  = {
  "errors":{
    "meters.electric":[ 
      {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]}  
    ],
    "forename":[ 
      {"invalid_character":["Invalid character in forname.", "Blah blah."]}
    ]
  }
};   

我有一个从API返回的对象,我需要提取结束值以创建单个字符串。来自owuld的预期输出是:

The smart meter field is required. The selected reading is invalid.Invalid character in forname. Blah blah.

我知道我可以构建一系列循环来实现这一目标,但是有一种lodash方式吗?有点像https://lodash.com/docs#flattenDeep

3 个答案:

答案 0 :(得分:2)

看起来有点荒谬,但它有效:

var flattenStrings = _.flatMap(_.flatMap(a.errors), function (i) { 
    return _.flatMap(i); 
});

_.join(flattenStrings, ' ')

Example

答案 1 :(得分:2)

请允许我用一些有组合的lodash来娱乐你。

在连接字符串之前,您可能需要一个可以从任意复杂度的对象/数组中提取值的泛型函数。以下是使用现有lodash构建块构建此函数的方法:

flattenCol()

这将从您的结构中提取所有值,在本例中为字符串。让我们打破这个:

我发现保持这种通用功能非常有用。要构建字符串,您可以这样做:

flattenCol(a).join(' ');

或者,如果你想保持作曲派对:

const errorString = _.flow(flattenCol, _.partialRight(_.join, ' '));
errorString(a);

答案 2 :(得分:1)

为了与lodash进行比较,这是一种使用vanilla JavaScript的方法:

var a  = {
  "errors":{
    "meters.electric":[ 
      {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]}  
    ],
    "forename":[ 
      {"invalid_character":["Invalid character in forname.", "Blah blah."]}
    ]
  }
};

function flattenStrings(obj) {
  if (typeof obj != 'object') {
    return obj.toString();
  }
  return Object.keys(obj).map(function(key) {
    return flattenStrings(obj[key]);
  }).join("");
}

console.log(flattenStrings(a));

请注意,通过同样处理数组和普通对象并使用Object.keys(),数组的索引不能保证以稳定的顺序命中,因此可能在不同浏览器上的同一对象上运行此索引可能以不同的顺序排列字符串的连接。

你可以通过一些额外的代码来解决这个问题,但这里看起来并不重要。