Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用lodash提取混合对象/数组的叶子_Javascript_Lodash - Fatal编程技术网

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

Javascript 使用lodash提取混合对象/数组的叶子,javascript,lodash,Javascript,Lodash,我有一个从API返回的对象,我需要提取结束值来创建单个字符串。上述设备的预期输出应为: var a = { "errors":{ "meters.electric":[ {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]} ], "forename":[ {"invalid_charac

我有一个从API返回的对象,我需要提取结束值来创建单个字符串。上述设备的预期输出应为:

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."]}
    ]
  }
};   

我知道我可以构建一系列的循环来实现这一点,但有没有一种洛达斯方法?一些类似于?

的东西看起来有点可笑,但它很管用:

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

与lodash相比,这里有一种使用香草JavaScript的方法:

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

_.join(flattenStrings, ' ')
请注意,通过将数组和普通对象等同对待并使用
Object.keys()
,数组的索引不能保证以稳定的顺序命中,因此在不同浏览器上的同一对象上运行此操作可能会使字符串的串联顺序不同


你可以用一些额外的代码来解决这个问题,但在这里它并不重要。

请允许我用一些合成矿粉来逗你开心

在连接字符串之前,您可能需要一个通用函数,该函数可以从任意复杂度的对象/数组中提取值。以下是使用现有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."]}
    ]
  }
};

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));
这将从结构中提取所有值,在本例中为字符串。让我们来分析一下:

  • 用于组成更大的函数、out和
  • 用于确保仅向传递一个参数值
  • 组成一个函数,其中迭代器参数部分应用于
  • 组合一个函数,该函数根据传入的条件返回映射值。例如,如果或返回true,它将递归调用
    flattcol()
    。否则,为默认值,我们只返回值
  • 在这一点上,我们有一个嵌套的值数组结构-将其展平为一个简单数组
我发现保留这样的通用功能非常有用。要构建字符串,只需执行以下操作:

const flattenCol = _.flow(
  _.identity,
  _.partialRight(_.map, _.cond([
    [_.isArray, flattenCol],
    [_.isPlainObject, flattenCol],
    [_.stubTrue, _.identity],
  ])),
  _.flattenDeep
);
或者,如果您想让合成派对继续进行:

flattenCol(a).join(' ');

你能举个更广泛的例子吗?您希望它对对象中的其他属性做什么?是否要.toString并连接树中作为基元的每个属性?或者仅仅是那些字符串?我在对象中添加了一些部分,并扩展了句子。基本上,是的,我只想要视图的错误字符串,第一次从lodash开始..哈,这太糟糕了。我就知道会有这样的事,谢谢!事实上,尽管我现在正试图让我的头脑进入lodash,但它在压缩时是一个很小的库,我开始认为它在长期运行中是值得的,而不是试图告诉你如果你想的话不要使用lodash!我个人觉得看到这两者并排对上下文很有帮助,所以我想其他人也可能会这样。这对我来说是一个很大的鼓舞,让我得到了想要的东西(从而得到了我的支持),但您给出的确切示例实际上不起作用,因为您在初始化变量之前直接引用了变量
flattcol
。因此,它失败的原因与
const a=a*2
失败的原因相同。虽然我没有在这里进行测试,但我认为使用一个只调用flattcol的函数来代替直接使用它(例如
(e)=>flattcol(e)
)可能会起作用。
const errorString = _.flow(flattenCol, _.partialRight(_.join, ' '));
errorString(a);