【问题标题】:javascript help to change a method structure [duplicate]javascript帮助更改方法结构[重复]
【发布时间】:2025-12-30 02:15:06
【问题描述】:

我有以下代码,它是一个递归函数,我用它来解析复杂的 Json 响应,它检测当前代码是字符串、JsonObject 还是数组。这个功能对于那些使用空手道或者想要解析复杂的 JSON 响应的人非常有帮助

function parseIt0(data, [key, ...path]) {
    return (Array.isArray(data) ? data : [data]).reduce((acc, obj) => {
        if (path.length) {
            acc.push(parseIt0(obj[key], path));
        } else if (obj[key]) {
            acc.push(obj[key]);
        }
        return acc;
    }, []).flat();
}

function getValue(response, s) {
    if (!response) return null;
    if (!s) return response;
    var path = s.split('.');
    return parseIt0(JSON.parse(response), path).flat();
}

//which can be used like this
var response2 = '{"data":[{"type":"node--base_product_coffee","id":"6dbb5a52-13ea-4f74-8af9-eb9e3ba45918","date":"1990","data1":[{"type1":"product_coffee1","id1":"6dbb5a52-13ea-4f74-8af9-eb9e3ba45777","date1":[{"res":"oui"},{"res":"non"}]},{"type1":"product_coffee2","id1":"6dbb5a52-13ea-4f74-8af9-eb9e3ba45666","date1":[{"res":"ouiii"},{"res":"nonnn"}]}]}]}';

console.log(getValue(response2, 'data.data1.date1.res');
//which gives : ['oui','non','ouiii','nonnn']

这段代码的问题是我不能在空手道框架中使用它,因为它在这部分 [key, ...path] 上给了我错误,它不接受它。

所以我的问题是如果有人可以帮助我编写相同的函数 parseIt0 像这个 parseIt0(response, path) 路径将是一个数组

我开始写这个,但我没有成功

removeItemOnce = function(arr, value) {
    var index = arr.indexOf(value);
    if (index > -1) {
        arr.splice(index, 1);
    }
    return arr;
}

function parseIt1(data, path) { 
    return (Array.isArray(data) ? data : [data]).reduce((acc, obj) => {
        if (path.length) {
            acc.push(parseIt1(obj[path[0]], removeItemOnce(path, path[0])));
        } else if (obj[path[k]]) {
            acc.push(obj[path[0]]);
        }
        return acc;
    }, []).flat();
}

function getValue2(response, s) {
    if (!response) return null;
    if (!s) return response;
    var path = s.split('.');
    return parseIt1(JSON.parse(response), path).flat();
}

// this in order to use it like the previous code
console.log(getValue2(response2, 'data.data1.date1.res');

谁能帮帮我 谢谢

【问题讨论】:

  • 实际错误是什么?请创建一个可执行示例。见meta.*.com/questions/358992/…
  • 错误在函数 parseIt1 中,我无法得到与 parseIt0 相同的结果。

标签: javascript karate


【解决方案1】:

我无法阅读或理解您的代码,但我只想说,Karate 1.0 应该更容易处理 JSON 并进行这些类型检查。

请阅读这部分升级指南:https://github.com/intuit/karate/wiki/1.0-upgrade-guide#type-conversion

  • 新的 karate.fromString() 可以从 JS 块中的 JSON 或 XML 字符串自动转换
  • 新的 karate.typeOf() 来检测给定对象的“类型”是什么

你将能够使用 ES6 循环结构:

* array.forEach(x => console.log(x))

最后注意空手道 JSON 助手:https://github.com/intuit/karate#json-transforms

如果您仍然卡住,请简化您的问题,并一次提出一个具体问题。但是,是的,可能还有其他人比我更有耐心。

【讨论】: