【问题标题】:How to map a key/value array instead of an object如何映射键/值数组而不是对象
【发布时间】:2019-11-07 00:06:20
【问题描述】:

我需要从某些表单中获取一些值,因此当我需要从表单中调用特定值时,我想调用数组中的特定键。但是Array.prototype.map 创建了一个索引为 (0, 1, 2) 的对象,然后存储了键/值,因此我无法在不知道索引的情况下访问特定值。

我尝试了 array.push() 以及来自 here 的函数,这似乎太多了,因为我知道有一个更简单的方法。

let extraClassArray = licenseClass
    .map( ( i, e ) => {
        if ( '' != $( e ).val() && e.hasAttribute( 'required' ) ) {
            let id = $( e ).data( 'parent' );
            let obj = {};
            switch ( $( e ).val() ) {
                case 'A':
                    obj.A =
                        '1' ===
                        $( '#license-class-' + id )
                            .find( '#license-class-' + id + '-a-value:checked' )
                            .val() ?
                            '1' :
                            '0';
                    break;
                case 'A2':
                    obj.A2 =
                        '1' ===
                        $( '#license-class-' + id )
                            .find( '#license-class-' + id + '-a2-value:checked' )
                            .val() ?
                            '1' :
                            '0';
                    break;
                case 'B':
                    obj.BF17 =
                        '1' ===
                        $( '#license-class-' + id )
                            .find(
                                '#license-class-' + id + '-bf17-value:checked'
                            )
                            .val() ?
                            '1' :
                            '0';
                    break;
                default:
                    break;
            }
            return obj;
        }
    })
    .get();

console.log(extraClassArray);

我希望能够调用例如 extraClassArrat['A'] 以获取值 0 或 1。

【问题讨论】:

  • 你映射的是什么数组?看起来您的问题缺少一些重要的代码。请阅读如何创建Minimal, Complete, Reproducible Example
  • @Daan 我在选择选项更改时映射来自不同复选框的值。
  • 使用let obj = {};,而不是[]
  • @Bergi 这是我使用 {} 的错字。据我所知,[] 返回和空数组。

标签: javascript jquery arrays object array.prototype.map


【解决方案1】:

您的代码正在创建一个具有附加属性 A、A2 等的数组。

首先,我认为您对数组和对象之间的区别感到困惑,应该阅读一下(也许您来自 PHP?)

在您的情况下,您应该做的是在循环之外创建一个对象并在循环期间分配其属性。所以你应该使用 foreach() 而不是 map。

类似的东西:

const extraClassArray = {};
licenseClass
.forEach( ( i, e ) => {
    if ( '' != $( e ).val() && e.hasAttribute( 'required' ) ) {
        let id = $( e ).data( 'parent' );
        switch ( $( e ).val() ) {
            case 'A':
                extraClassArray.A =
                    '1' ===
                    $( '#license-class-' + id )
                        .find( '#license-class-' + id + '-a-value:checked' )
                        .val() ?
                        '1' :
                        '0';
                break;
            case 'A2':
                extraClassArray.A2 =
                    '1' ===
                    $( '#license-class-' + id )
                        .find( '#license-class-' + id + '-a2-value:checked' )
                        .val() ?
                        '1' :
                        '0';
                break;
            case 'B':
                extraClassArray.BF17 =
                    '1' ===
                    $( '#license-class-' + id )
                        .find(
                            '#license-class-' + id + '-bf17-value:checked'
                        )
                        .val() ?
                        '1' :
                        '0';
                break;
            default:
                break;
        }
    }
})

【讨论】:

  • 是的,我来自 PHP。不过,我确实理解其中的区别。您的解决方案似乎可行,我会尝试一下。
  • 我添加了一个例子,所以你明白了
  • 顺便说一句,我保留了地图而不是您的 forEach,仍然可以正常工作。
  • @AmirRami 它仍然有效,但 map 返回一个新数组,而 forEach 不返回任何内容,因此您应该在这种情况下使用 forEach
【解决方案2】:

你可以使用一个简单的 javascript 对象:

var obj = {
    key1: value1,
    key2: value2
};

像这样添加属性:

obj["key3"] = "value3";

并以这种方式获取您的价值观:

var getProperty = function (propertyName) {
    return obj[propertyName];
};

getProperty("key1");
getProperty("key2");
getProperty("key3");

【讨论】:

  • 我需要动态地将值输入到数组中,使用switch。所以Array.prototype.map 不行吗?
猜你喜欢
  • 2012-05-30
  • 2019-04-03
  • 2013-01-26
  • 1970-01-01
  • 2019-04-28
  • 2017-07-31
相关资源
最近更新 更多