这段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;
}
答案 0 :(得分:2)
reduce
是错误的方法。使用find
或filter
。您甚至可以在已有的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
。