node.js - 如果语句未按预期工作

时间:2018-01-27 14:42:27

标签: json node.js reduce

这段node.js代码是针对Spark History Server API运行的。

它应该做的是找到名称与uuid传入的值匹配的任何作业,并仅返回该作业的id。

以下代码实际执行的操作是,如果在任何作业名称中找到uuid,则返回每个作业的ID。

我认为这与我解析JSON的方式有关,但我并不完全确定。

如何更改此设置以使其按照我的意愿运行?

var arrFound = Object.keys(json).filter(function(key) {
    console.log("gel json[key].name" + json[key].name);
    return json[key].name;
}).reduce(function(obj, key){
    if (json[key].name.indexOf(uuid)) {
        obj = json[key].id;
    return obj;
    }

2 个答案:

答案 0 :(得分:2)

reduce是错误的方法。使用findfilter。您甚至可以在已有的filter回调中执行此操作。然后,您可以将map链接到该id以获取每个匹配键的var arrFound = Object.keys(json).filter(function(key) { console.log("gel json[key].name " + json[key].name); return json[key].name && json[key].name.includes(uuid); }).map(function(key) { return json[key].id; }); console.log (arrFound); // array of matched id values 属性值:

indexOf

另请注意,您使用includes是错误的。您需要将该值与-1(未找到)进行比较。但是现在你可以使用Object.values返回一个布尔值。

请注意,使用var arrFound = Object.values(json).filter(function(obj) { console.log("gel obj.name " + obj.name); return obj.name && obj.name.includes(uuid); }).map(function(obj) { return obj.id; }); console.log (arrFound); // array of matched id values 列出对象而不是键,这在您的情况下更有趣:

{{1}}

答案 1 :(得分:2)

虽然接受的答案提供了工作代码,但我觉得值得指出的是reduce是解决这个问题的好方法,对我来说比链接filter和{{1}更有意义。 }:

map

const jobs = { 1: { id: 1, name: 'job: 2a2912c5-9ec8-4ead-9a8f-724ab44fc9c7' }, 2: { id: 2, name: 'job: 30ea8ab2-ae3f-4427-8e44-5090d064d58d' }, 3: { id: 3, name: 'job: 5f8abe54-8417-4b3c-90f1-a7f4aad67cfb' }, 4: { id: 4, name: 'job: 30ea8ab2-ae3f-4427-8e44-5090d064d58d' } } const matchUUID = uuid => (acc, job) => job.name.includes(uuid) ? [ ...acc, job.id ] : acc const target = '30ea8ab2-ae3f-4427-8e44-5090d064d58d' const matchTarget = matchUUID(target) // [ 2, 4 ] console.log(Object.values(jobs).reduce(matchTarget, []))适用于这些类型的问题:获取更大,更复杂或更完整的值,并减少到您需要的数据。在大型数据集上,它也可以更高效,因为您只需要遍历集合一次。

如果您受Node版本限制或不想使用数组传播,那么这是一个稍微“传统”的版本:

reduce

请注意使用var result = Object.keys(jobs).reduce( function (acc, key) { if (jobs[key].name.includes(uuid)) { acc.push(jobs[key].id) } return acc }, [] ) ,因为Object.keys是ES2017,可能并非总是可用。 Object.values是ES2015,但如果需要,您可以随时使用String.prototype.includes