Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
批量声明JavaScript关联数组_Javascript_Jquery_Arrays_Associative Array_Object Literal - Fatal编程技术网

批量声明JavaScript关联数组

批量声明JavaScript关联数组,javascript,jquery,arrays,associative-array,object-literal,Javascript,Jquery,Arrays,Associative Array,Object Literal,是否有一种方法可以在JavaScript中批量设置关联数组键和值,类似于下面PHP的速记数组声明 $array = [ 'foo' => 'val1', 'bar' => 'val2', 'baz' => 'val3' ]; 我能想到的在JS中声明关联数组的唯一方法如下: var newArray = new Array(); newArray['foo'] = 'val1'; newArray['bar'] = 'val2'; newArray['baz'] =

是否有一种方法可以在JavaScript中批量设置关联数组键和值,类似于下面PHP的速记数组声明

$array = [
  'foo' => 'val1',
  'bar' => 'val2',
  'baz' => 'val3'
];
我能想到的在JS中声明关联数组的唯一方法如下:

var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
  keys = ['foo', 'bar', 'baz'],
  vals = ['val1', 'val2', 'val3'];

for(var i = 0; i < keys.length; i++) {
  newArray[ keys[i] ] = vals[i];
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myData = {
    foo: 'val1',
    bar: 'val2',
    baz: 'val3'
};
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
    init: function() {
        this.foo = $('foo');
        this.bar = this.foo.find('bar');
        this.baz = this.foo.find('baz');
    }
}

// then, sometime when you know the DOM is ready
myObject.init();
或者像这样:

var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
  keys = ['foo', 'bar', 'baz'],
  vals = ['val1', 'val2', 'val3'];

for(var i = 0; i < keys.length; i++) {
  newArray[ keys[i] ] = vals[i];
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myData = {
    foo: 'val1',
    bar: 'val2',
    baz: 'val3'
};
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
    init: function() {
        this.foo = $('foo');
        this.bar = this.foo.find('bar');
        this.baz = this.foo.find('baz');
    }
}

// then, sometime when you know the DOM is ready
myObject.init();
不幸的是,JS对象文本似乎不允许计算代码为其属性设置值。如果我将这些属性转换为返回值的方法,而不是将值/引用永久存储在属性中,那么每次调用它们时,它们都必须运行;如果可能的话,我真的不想那样做

提前感谢。

PHP的“关联数组”——一组有序的名称/值对——是一种相当罕见的数据结构,作为语言的一种功能而不是作为库类发现尤为罕见。JavaScript还没有它们-。ES6通常会为语言引入更好的迭代语义,以及一个标准的库
Map
类型,它利用了这些语义,以便在迭代时访问中的条目;下面是更多

ES6之前 在ES6之前,您可以使用对象,如您所知:

var obj = {
  foo: 'val1',
  bar: 'val2',
  baz: 'val3'
};
var map = new Map([
    ["foo", "val1"],
    ["bar", "val2"],
    ["baz", "val3"]
]);
…但属性没有顺序。如果顺序很重要,则必须单独跟踪顺序,可能需要将关键点放在一个数组中:

var keys = ['foo', 'bar', 'baz'];
var obj = {
  foo: 'val1',
  bar: 'val2',
  baz: 'val3'
};
var i;
for (i = 0; i < keys.length; ++i) {
    console.log(obj[keys[i]]);
}
因此,当它得到广泛支持时,这将是等效的形式

更多关于(和)中的
Map


不幸的是,JS对象文本似乎不允许计算代码为其属性设置值

是的,有。在您的示例中,
foo
属性将是一个jQuery对象,其中包含一组与CSS选择器
foo
匹配的元素(一组可能为空,因为没有
foo
元素)

例如:

var obj = {
    foo: 6 * 7
};
console.log(obj.foo); // 42
在这样的属性初始值设定项中,不能(目前)使用表达式作为属性名称,只能使用值。在ES6中,还可以对属性名称使用表达式:

// As of ES6
var obj = {
    ['f' + 'o' + 'o']: 6 * 7
};
console.log(obj.foo); // 42
同时,在ES5中,我们可以这样做,但在初始值设定项中不行:

// Now
var obj = {};
obj['f' + 'o' + 'o'] = 6 * 7;
console.log(obj.foo); // 42

我已经尝试在jQuery中使用JS对象文字,如下所示:

var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
  keys = ['foo', 'bar', 'baz'],
  vals = ['val1', 'val2', 'val3'];

for(var i = 0; i < keys.length; i++) {
  newArray[ keys[i] ] = vals[i];
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myData = {
    foo: 'val1',
    bar: 'val2',
    baz: 'val3'
};
var myObject = {
  foo: $('foo'),
  bar: $(this.foo).find('bar'),
  baz: $(this.bar).data('baz')
}
var myObject = {
    init: function() {
        this.foo = $('foo');
        this.bar = this.foo.find('bar');
        this.baz = this.foo.find('baz');
    }
}

// then, sometime when you know the DOM is ready
myObject.init();
这里有几个问题:

  • $('foo')
    查找带有标记的元素
    foo
    -没有
    foo
    HTML标记。也许你的意思是
    #foo
    .foo
    (或者
    foo
    只是作为
    div
    span
    或任何东西的替身)

  • 您的
    foo
    属性的值已经是jQuery对象,无需在另一个
    $()
    调用中包装它

  • 在对象初始值设定项内没有特殊意义,它与对象初始值设定项外的
    相同,而不是对正在初始化的对象的引用。也不起作用,因为在初始化属性时,
    myObject
    尚未为其分配任何值。下面是如何计算上面的整体表达式:

  • 在范围中的任何分步代码之前,将创建一个名为
    myObject
    的变量,其值为
    undefined

  • 在逐步执行代码时到达表达式时,通过计算右侧(
    =
    后面的位)开始赋值表达式

  • 要启动对象初始值设定项表达式,将创建一个新对象,但不存储在任何位置

  • 对象初始值设定项中的每个属性初始值设定项都是按源代码顺序处理的(是的,这由规范保证),如下所示:

    var obj = {
      foo: 'val1',
      bar: 'val2',
      baz: 'val3'
    };
    
    var map = new Map([
        ["foo", "val1"],
        ["bar", "val2"],
        ["baz", "val3"]
    ]);
    
  • 计算定义其属性的表达式

  • 使用给定的键和计算值在对象上创建属性

  • 当对象初始值设定项完成时,结果值(对象引用)被指定给
    myObject

  • 要从定义对象其他属性的表达式中引用对象的属性,必须执行一系列语句,而不是单个语句:

    var myObject = {
      foo: $('foo') // or $('#foo') or $('.foo') or whatever it is
    };
    myObject.bar = myObject.foo.find('bar');
    myObject.baz = myObject.bar.data('baz');
    
    或者,您可以使用临时变量执行一些复杂的操作:

    var foo, bar, myObject = {
      foo: (foo = $('foo')),
      bar: (bar = foo.find('bar')),
      baz: bar.data('baz')
    };
    
    …因为赋值表达式的结果是已赋值的值。(属性和变量之间没有持久的联系。)但是这些临时变量仍然存在。您可以将整个内容包装在一个函数中,以便临时变量仅临时存在:

    var myObject = (function() {
      var foo, bar;
      return {
        foo: (foo = $('foo')),
        bar: (bar = foo.find('bar')),
        baz: bar.data('baz')
      };
    })();
    
    …但这变得非常复杂。:-)


    下面是您的评论:

    对什么类型的表达式可以计算为属性值有任何限制吗

    不,属性初始值设定项的值的表达式处理与包含属性初始值设定项所属的对象初始值设定项的范围中其他位置的表达式处理完全相同

    下面是一个通过jQuery获取一些DOM元素的示例:

    var myObject={
    foo:$(“.foo”)
    };
    myObject.bar=myObject.foo.find('.bar');
    myObject.baz=myObject.bar.data('baz');
    myObject.foo.css(“颜色”、“绿色”);
    myObject.bar.css(“颜色”、“蓝色”);
    $(“”).html(myObject.baz).appendTo(document.body);//“我就是数据”
    
    这是一个
    这是.foo里面的一个.bar
    
    如果您只是试图用一组属性/值对声明一个Javascript对象,您可以这样做:

    var newArray = new Array();
    newArray['foo'] = 'val1';
    newArray['bar'] = 'val2';
    newArray['baz'] = 'val3';
    
    var newArray = new Array(),
      keys = ['foo', 'bar', 'baz'],
      vals = ['val1', 'val2', 'val3'];
    
    for(var i = 0; i < keys.length; i++) {
      newArray[ keys[i] ] = vals[i];
    }
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myData = {
        foo: 'val1',
        bar: 'val2',
        baz: 'val3'
    };
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myObject = {
        init: function() {
            this.foo = $('foo');
            this.bar = this.foo.find('bar');
            this.baz = this.foo.find('baz');
        }
    }
    
    // then, sometime when you know the DOM is ready
    myObject.init();
    
    然后您可以通过以下方式访问:

    console.log(myData.foo);   // `val1`    
    console.log(myData.bar);   // `val2`
    console.log(myData.baz);   // `val3`
    
    注意,Javascript没有称为“关联数组”的数据类型。大多数Javascript开发人员使用具有属性名称的对象来解决类似的问题,但Javascript对象并不维护一组有序的属性,它们是无序的


    你不能这样做:

    var newArray = new Array();
    newArray['foo'] = 'val1';
    newArray['bar'] = 'val2';
    newArray['baz'] = 'val3';
    
    var newArray = new Array(),
      keys = ['foo', 'bar', 'baz'],
      vals = ['val1', 'val2', 'val3'];
    
    for(var i = 0; i < keys.length; i++) {
      newArray[ keys[i] ] = vals[i];
    }
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myData = {
        foo: 'val1',
        bar: 'val2',
        baz: 'val3'
    };
    
    var myObject = {
      foo: $('foo'),
      bar: $(this.foo).find('bar'),
      baz: $(this.bar).data('baz')
    }
    
    var myObject = {
        init: function() {
            this.foo = $('foo');
            this.bar = this.foo.find('bar');
            this.baz = this.foo.find('baz');
        }
    }
    
    // then, sometime when you know the DOM is ready
    myObject.init();
    
    因为
    不会从声明中指向对象本身。Javascript就是不能这样工作。您必须添加