javascript - javascript用逗号序列化json数组
问题描述
我正在尝试应用此函数如何将数组参数化为单个逗号分隔值?在一个 '按其名称调用的函数' 脚本中,但它没有按预期工作:
function add(a,b,c){
return a+b+c
}
var vals = callFct("add", window, 2,3,4);
document.getElementById('result').innerHTML += "<br>Function result: "+vals
// result = Function result: 9 ----> 2+3+4 : OK
这些值来自:json={a:[2,3,4]}
function serialize(vals){
var output = [];
for (var prop in vals) {
if (vals.hasOwnProperty(prop)){
output.push(vals[prop].join(','));
}
}
return output;
}
var json = {a:[2,3,4]};
document.getElementById('result').innerHTML += "<br>Used data: "+serialize(json)
// result = Used data: 2,3,4 ---> seems to be OK... but
var test = callFct("add", window, serialize(json));
document.getElementById('result').innerHTML += "<br>Function result: "+test
// result = Function result : 2,3,4undefinedundefined ---> oups
我试图删除“未定义”...
document.getElementById('result').innerHTML += "<br>Function result : "+test.replace(/undefined/g,'')
// result = Function result : 2,3,4 ---> nope
被调用函数:
function callFct(w, y, z ) {
var z = Array.prototype.slice.call(arguments, 2);
console.log('vars = '+z)
let v = w.split(".");
let x = v.pop();
for(var i = 0; i < v.length; i++) {
y = y[v[i]];
}
return y[x].apply(y, z);
}
我的前进方式有什么问题?
解决方案
请提供比 、 和 ... 更好w
的y
参数z
名称
如果您将名称更改为下面演示中看到的名称,您的 return 语句将如下所示:
return scope[last].apply(funcName, serialized);
如果您注意到,您正在调用 apply on window.add
。确保该方法存在。我不确定是什么add
样子,但它将采用“序列化”的 JSON 数据,并且调用的范围将是传入的字符串(第一个)参数(显然可以用点分隔)。
笔记
- 您可以将 this: 更改
[...output, json[prop].join(',')]
为 this: 以output.concat(json[prop].join(','))
实现浏览器兼容性。 flatMap
可以在此处找到“基本” polyfill : https ://stackoverflow.com/a/39838385/1762224
const json = { a: [2, 3, 4] };
document.getElementById('result-1').innerHTML = 'Values: ' + serialize(json);
let sum = callFct('add', window, serialize(json));
document.getElementById('result-2').innerHTML = 'Sum: ' + sum;
let difference = callFct('subtract', window, serialize(json));
document.getElementById('result-3').innerHTML = 'Difference: ' + difference;
function serialize(json) {
return Object.keys(json).reduce((output, prop) => {
return [...output, json[prop].join(',')];
}, []);
}
function callFct(funcName, scope, serialized) {
serialized = Array.from(arguments).slice(2);
console.log('vars = ' + serialized)
const tokens = funcName.split('.');
const last = tokens.pop();
for (let i = 0; i < tokens.length; i++) {
scope = scope[tokens[i]];
}
return scope[last].apply(funcName, serialized);
}
function prepareValues(serialized) {
return serialized
.flatMap(v => v.split(/,\s*/g))
.map(v => parseInt(v, 10));
}
function add(serialized) {
return prepareValues(serialized)
.reduce((s, v) => s + v, 0);
}
function subtract(serialized) {
return prepareValues(serialized)
.reduce((s, v) => s - v);
}
div[id^="result-"] { font-family: monospace; }
<script src="https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.flatMap"></script>
<div id="result-1"></div>
<div id="result-2"></div>
<div id="result-3"></div>
推荐阅读
- javascript - 这个 JSON 字符串有什么问题?
- typescript - 只有在导入文件时,Typescript 才会引发错误
- click - 如何制作一个点击特定窗口中特定点并且在后台运行的 ahk 项目?
- javascript - 在每个引导列之间添加一个空格
- go - 在一个案例中有多个选项,然后在案例中进行一个循环
- flutter - 使用 Search Delegate (Flutter) 时如何在 buildResult 方法中调用 this.close?
- python - 正则表达式在多行文本中查找包含句子的段落
- sql - PostgreSQL创建触发器:插入操作的语法错误
- mysql - mysql 中的 if 语句触发
- javascript - 从vuex路由到错误页面后如何停止代码执行?