将字符串添加到javascript数组

时间:2015-01-21 13:25:05

标签: javascript

我有以下代码

array = {};

function add(group,to_add){

    var index,to_append = "";

    if(array[group] === null || array[group] === undefined){
        array[group] = [to_add];
        index = array.length;
        if(index != 0)
            index = array.length--;
    }else{
        array[group].push(to_add);
        index = array.indexOf(group)--;
    }

}

add("some_group","something")之后执行console.log(array)数组日志为空,我无法理解为什么......有人可以帮我解决这个问题吗? Tyvm

修改

等待所有我有array = {}之后的等待。错误仍然存​​在:' x

第3章:神秘感加深

伙计们,通过上面的代码,我只有在数组之前没有空的情况下才能使用,所以如果数组是{ some_key: Array[1] },它实际上是有效的。有什么想法吗? xD ' GROUP'与' some_key'不同,因此该群组是"新"

3 个答案:

答案 0 :(得分:3)

数组已编号,无法像

那样进行访问
var array = [];
array[0] = 'something';

在您的情况下,您需要一个对象

var obj = {};
obj['name'] = 'dave';

请注意,虽然你的代码现在会给NaN一个长度,因为对象没有长度属性(所以array.length不会工作,当你尝试增加/减少它时给你NaN)

您需要Object.keys(obj).length来获取长度

Object.keys({name:'bob'}).length的长度为1

答案 1 :(得分:2)

在@ Andy的答案的基础上,它可以进一步深化:

var data = {};

function add(group, value) {
    data[group] = data[group] || [];
    data[group].push(value);
}

为什么您的代码失败

真的,这一行给你带来了问题:

    if(index != 0)
        index = array.length--;

array.length上使用递减运算符会导致数组删除刚刚推送的最后一个值。这也是为什么你的代码只在数组为空时失败的原因,因为如果数组已经存在,你不会减少array.index

将其封装在类

为什么不把它变成一个单独的对象,或者更好的是一个类?

function DataStore(data) {
    this.data = data || {};
}

DataStore.prototype = {

    constructor: DataStore,

    add: function(group, value) {
        this.data[group] =  this.data[group] || [];

        return this.data[group].push(value) - 1;
    },

    contains: function(group, value) {
        if (!this.containsGroup(group)) {
            return false;
        }

        return this.data[group].indexOf(value) > -1;
    },

    containsGroup: function(group) {
        return this.data.hasOwnProperty(group);
    },

    forEach: function(callback, context) {
        context = context || this;

        var key, index, value, length;

        for (key in this.data) {
            if (this.data.hasOwnProperty(key)) {
                for (index = 0, length = this.data[key].length; i < length; i++) {
                    value = this.data[key][index];

                    if (callback.call(context, value, index, key) === false) {
                        return;
                    }
                }
            }
        }
    },

    get: function(group, index) {
        if (!this.containsGroup(group)) {
            return null;
        }
        else if (index == null) {
            return this.data[group];
        }
        else if (index >= 0 && index < this.data[group].length) {
            return this.data[group][index];
        }
        else {
            return null;
        }
    },

    remove: function(group, value) {
        if (!this.containsGroup(group)) {
            return -1;
        }

        var index = this.data[group].indexOf(value);

        this.data[group].splice(index, 1);

        return index;
    }

};

然后使用它:

// An empty DataStore:
var data = new DataStore();

data.add("group", "value");
data.containsGroup("group"); // returns true
data.contains("group", "value"); // returns true;

data.forEach(function(value, index, group) {
    console.log(group + "[" + index + "] = " + value);
}); 

// Seed the data store with values:
var data2 = new DataStore({
    foo: ["bar", "baz"]
});

data2.contains("foo", "baz"); // returns true;

答案 2 :(得分:1)

你的意思是写这样的东西吗?它创建了一个对象。如果密钥不存在,则添加一个数组作为值。然后将第二个参数添加到数组中。

var obj = {};

function add(group, to_add) {
  if (!obj[group]) obj[group] = [];
  obj[group].push(to_add);
}

add("some_group","something");