为什么我不能在Javascript上控制整个数组的日志/字符串化?

时间:2015-02-21 16:21:01

标签: javascript arrays json

所以我在努力尝试在Javascript上访问一个复杂的数组。

简单来说,我有一个像这样的数组:

globalForm['prop1'] = anotherArray[];
globalForm['prop2'] = yetAnotherArray[];

如果我尝试:

console.log(globalForm);
//-or-
JSON.stringify(globalForm)

我得到一个空的Array []或一个空的JSON对象。

但如果我这样做:

console.log(globalForm['prop1']);
//-or-
JSON.stringify(globalForm['prop1'])

我实际上得到了它的内容。

我在尝试记录或整理整个数组时做错了什么/傻了吗?我想要实现的是从该数组创建一个复杂的JSON对象。

这是我的实际代码: 对于prop1:

var completedWeights = [];
globalForm['CompletedFormPhoto'] = images;

var radio_groups = {}
$(".weightRadio:radio").each(function(){
    radio_groups[this.name] = true;
});
for(group in radio_groups){
    thisGroup = $(".weightRadio:radio[name="+group+"]:checked");
    if_checked = !!thisGroup.length;
    completedWeights.push({'IdWeight':thisGroup.attr('name'), 'Value':thisGroup.val()});
}
globalForm['CompletedFormWeight'] = completedWeights;

对于prop2(这实际上在生成prop1之前执行):

var fileInput = document.getElementById('fileInput');
var fileDisplayArea = document.getElementById('fileDisplayArea');


fileInput.addEventListener('change', function(e) {
    var idImg = Date.now();
    var currentImageObj =[];
    var file = fileInput.files[0];
    var imageType = /image.*/;
    var addedImage = document.createElement('div');
    addedImage.className = 'addedImage';

    if (file.type.match(imageType)) {
        var reader = new FileReader();

        reader.onload = function(e) {
            var img = new Image();
            img.src = reader.result;
            img.id = idImg;
            addedImage.appendChild(img);

            var ind = img.src.indexOf(',/9j/') + 5;
            currentImageObj["Photo"] = img.src.substr(ind);

            images[idImg] = currentImageObj;
        }
        reader.readAsDataURL(file); 
        console.log(images);
    } else {
        addedImage.innerHTML = "File not supported!";
    }
    addComment = document.createElement('a');
    addComment.className = "btn btn-default btn-block addComment";
    addComment.setAttribute("data-toggle", "modal");
    addComment.setAttribute("data-target", "#myModal");
    addComment.text = "Agregar Comentario";
    addComment.id = idImg;

    addedImage.appendChild(addComment);
    fileDisplayArea.appendChild(addedImage);
});

数组实际内容的一些示例: enter image description here enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:1)

我假设您将globalForm创建为数组。 JavaScript中的数组只能理解整数索引。由于它们仍然是对象,您当然可以为它们命名属性,但这些属性不会填充数组。 JavaScript中点符号和括号索引的等价可能会误导你。

所以你要么只使用这样的数字:

globalForm=[]
globalForm[1]=["whatever"]
globalForm[2]=["etc"]

console.log(globalForm)
=> [undefined, ["whatever"], ["etc"]]

(请注意,数组索引从零开始)

...或者,如果您正在寻找更像名称和值之间的映射的东西,您应该只使用(非数组)对象:

globalForm={}
globalForm["prop1"]=["whatever"]
globalForm["prop2"]=["etc"]

console.log(globalForm)
=> {prop1: ["whatever"], prop2:["etc"]}

答案 1 :(得分:0)

你要做的就是完全没有理由将字符串化为复杂对象

另外值得注意的是它不是一个json对象,它是一个javascript对象,或一个描述对象的json字符串。

看看这个:

var object = {
    prop1 : 'what ever',
    prop2 : 'whatever to',
    prop3 : [
        {a : "a", b: 'b' },
        {a : "a", b: [
            {a : "a", b: 'b' },
            {a : "a", b: "b" },
            {a : "a", b: 'b' }
        ]},
        {a : "a", b: 'b' }
        ]
};

console.log(JSON.stringify(object));
// outPuts : {"prop1":"what ever","prop2":"whatever to","prop3":[{"a":"a","b":"b"},{"a":"a","b":[{"a":"a","b":"b"},{"a":"a","b":"b"},{"a":"a","b":"b"}]},{"a":"a","b":"b"}]}

http://jsfiddle.net/or6gj92y/

提示:当我遇到问题时,我会尝试使用jsfiddle.net或plunker之类的小版本进行"健全检查"希望有所帮助