我有两个函数,其中一个将对象推入一个数组。它调用另一个函数,该函数从对象中删除键并仅存储数组中的值。
但是,它没有将预期结果设置为全局数组,我将使用其余代码处理它。
var arr1 = [];
function foo(callback){
arr1.push({id: 1},{id: 2});
console.log(JSON.stringify(arr1));
callback(arr1);
}
foo(function(arr1){
bar(arr1);
});
function bar(arr1){
arr1 = arr1.map(x => x.id);
console.log(JSON.stringify(arr1));
}
console.log(JSON.stringify(arr1)); // I want the result to be [1,2]
我可以忽略第二个函数并将其所有内容放入第一个函数中,但这会使事情变得混乱,因为在我的实际代码库中,函数非常复杂。那么有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
在创建了json对象数组后,你可以编写下面的代码来获取id的数组,它将适合你
var arr = [ {id: 1, data: "data1"},
{id: 2, data: "data2"}];
var id_array = Object.keys(arr).map(function (k) {
return arr[k]['id'].toString();
});
答案 1 :(得分:1)
我不会质疑你的设计 - 听起来你必须简化一些复杂的代码。虽然其他答案提供了可行的替代解决方案,但它并不能解释原因。
JS参数不是" out" - 大致翻译成C,它们只是指针,而不是指针指针。如果替换函数内部的参数值(由map
结果执行),则修改将保留在函数范围内。如果您想要修改函数,请应用其他答案提出的任何方法:
真的没有办法解决它。 JS没有语法,也没有支持输出参数。
答案 2 :(得分:0)
您可以像这样使用json对象来隔离范围,而不必具有来自全局范围的“变量名称”依赖性。
var arr1 = {arr: []};
function test1(callback){
arr1.arr.push({id: 1},{id: 2});
console.log(JSON.stringify(arr1.arr));
callback(arr1);
}
test1(function(arr1){
test(arr1);
});
function test(arr1){
arr1.arr = arr1.arr.map(x => x.id);
console.log(JSON.stringify(arr1));
}
console.log(JSON.stringify(arr1.arr)); // I want the result to be [1,2]
答案 3 :(得分:0)
目前尚不清楚你的代码封闭范围,这可能会在将来导致问题,但如果你的设计真的需要这样的决定 - 在这里你可以采取实际的例子
var arr1 = [];
function test1(a, callback){
a.push({id: 1},{id: 2});
console.log('1', JSON.stringify(arr1));
callback(a);
}
test1(arr1, function(a){
test(a);
});
function test(a){
//better do not use, but it works
arr1 = a = a.map(x => x.id);
console.log('2', JSON.stringify(a));
}
console.log('3', JSON.stringify(arr1)); // I want the result to be [1,2]
答案 4 :(得分:0)
为什么不能让您的代码更简单,并执行类似下面的操作
var arr1 = [];
var arr2 = [];
function test1(arr){
arr.push({id: 1},{id: 2});
return arr;
}
function test(ar){
ar = arr1.map(x => x.id);
return ar;
}
var array1 = test(test1(arr1));
console.log(JSON.stringify(array1)); // I want the result to be [1,2]
var array2 = test(test1(arr2));
console.log(JSON.stringify(array2)); // I want the result to be [1,2]

答案 5 :(得分:0)
如果它是一个全局变量,将它作为参数传递给其他函数是没有意义的。你可以做到这一点。
var arr1 = [];
function test1(callback){
arr1.push({id: 1},{id: 2});
console.log(JSON.stringify(arr1));
callback();
}
test1(function(){
test();
});
function test(){
arr1 = arr1.map(x => x.id);
}
console.log(JSON.stringify(arr1));
您实际上并没有替换arr1
中全局变量test()
的值,而是替换arr1
的本地范围内存在的test()
的值