使用map更改数组的顺序

时间:2016-04-28 12:00:16

标签: javascript arrays

似乎人们对我想要实现的目标感到困惑,所以我会更好地解释这一点。 我有一系列原创产品。单个产品如下所示:

{
    "id": 1,
    "gtin": "8714574627946|4549292038446",
    "productId": "0592C022",
    "make": "Canon",
    "model": "750D + EF-S 18-55mm",
    "expert": false,
    "sponsored": false,
    "attributes": {
        "id": 1,
        "compatibleMemory": "SD, SDHC, SDXC\"",
        "whiteBalance": "ATW, Cloudy, Custom modes, Daylight, Flash, Fluorescent L, Shade, Tungsten\"",
        "sceneModes": "Food, Landscape, Sports\"",
        "shootingModes": "",
        "photoEffects": "",
        "cameraPlayback": "Movie, Single image, Slide show\"",
        "tripod": false,
        "directPrinting": false,
        "colour": "Black",
        "picture": {
            "id": 1,
            "megapixel": "24.2 MP",
            "type": "SLR Camera Kit",
            "sensorType": "CMOS",
            "maxResolution": "6000 x 4000 pixels",
            "resolutions": "3984x2656, 2976x1984, 1920x1280, 720x480, 5328x4000, 3552x2664, 2656x1992, 1696x1280, 640x480, 6000x3368, 3984x2240, 2976x1680, 1920x1080, 720x480, 4000x4000, 2656x2656, 1984x1984, 1280x1280, 480x480\"",
            "stablizer": true,
            "location": "Lens",
            "supportedAspectRatios": "2.9 cm",
            "totalMegapixels": "24.7 MP",
            "formats": "JPG"
        },
        "video": {
            "id": 1,
            "maxResolution": "1920 x 1080 pixels",
            "resolutions": "640 x 480, 1280 x 720, 1920 x 1080 pixels\"",
            "captureResolution": "",
            "frameRate": "",
            "fullHD": true,
            "supportedFormats": null
        },
        "audio": {
            "id": 1,
            "supportedFormats": ""
        },
        "battery": {
            "id": 1,
            "powerSource": "Battery",
            "technology": "Lithium-Ion (Li-Ion)",
            "life": "",
            "type": "LP-E17"
        },
        "dimensions": {
            "id": 1,
            "width": "",
            "depth": "7.78 cm",
            "height": "10.1 cm",
            "weight": "",
            "weightIncludingBattery": "555 g"
        },
        "display": {
            "id": 1,
            "type": "LCD",
            "diagonal": "7.62 cm (3\"\")\"",
            "resolution": "1040000 pixels"
        },
        "exposure": {
            "id": 1,
            "isoSensitivity": "100, 6400, 12800, Auto\"",
            "mode": "Auto, Manual\"",
            "correction": "�5EV (1/2; 1/3 EV step)",
            "metering": "Centre-weighted, Evaluative (Multi-pattern), Partial, Spot\"",
            "minimum": 100,
            "maxiumum": 12800
        },
        "flash": {
            "id": 1,
            "modes": "Hi-speed sync, Red-eye reduction\"",
            "exposureLock": true,
            "rangeWide": "",
            "rangeTelephoto": "",
            "rechargeTime": "",
            "speed": "1/200"
        },
        "focusing": {
            "id": 1,
            "focus": "TTL-CT-SIR",
            "adjustment": "",
            "autoFocusModes": "",
            "closestDistance": "0.25 m",
            "normalRange": "",
            "macroRangeTelephoto": "",
            "macroRangeWide": "",
            "autoModeTelephoto": "",
            "autoModeWide": ""
        },
        "interface": {
            "id": 1,
            "pictBridge": true,
            "usbVersion": "2.0",
            "usbType": "",
            "hdmi": true,
            "hdmiType": "Mini"
        },
        "lens": {
            "id": 1,
            "focalLength": "18 - 55 mm",
            "minimumFocalLength": "2.9 cm",
            "maximumFocalLength": "8.8 cm",
            "minimumAperture": "3.5",
            "maximumAperture": "38",
            "lensStructure": "13/11",
            "zoom": {
                "id": 1,
                "optical": "",
                "digital": "",
                "extraSmart": "",
                "combined": ""
            }
        },
        "network": {
            "id": 1,
            "wiFi": false,
            "wiFiStandards": "",
            "nfc": false
        },
        "shutter": {
            "id": 1,
            "fastestSpeed": "1/4000 s",
            "slowestSpeed": "30 s"
        }
    },
    "details": {
        "id": 1,
        "title": "Canon EOS 750D + EF-S 18-55mm",
        "description": "\"<b>Take your pictures to the next level with EOS 750D</b>\\n- Effortlessly take your pictures to the next level with the latest DSLR technology and Scene Intelligent Auto mode.\\n- Effortlessly capture stunning detail in any situation\\n- Record cinematic movies as easily as you shoot stills\\n- Easily connect and share your images with the world\\n\\n<b>Take your pictures to the next level with EOS 750D</b>\\n<b>Range of shooting modes</b>\\nEffortlessly capture stunning images using the latest DSLR technology with Basic and Creative modes, which allow you to take as much or as little control as you like.\\n\\n<b>Moveable screen for creative framing</b>\\nExplore creative shooting angles and enjoy simple and intuitive access to controls using the 3.0\"\" (7.7cm) Vari Angle LCD touch screen\\n\\n<b>Intelligent Viewfinder</b>\\nEOS 750D features an Intelligent Viewfinder which gives a much enhanced shooting experience. As you look through the viewfinder you can more easily see the focus point and any active AF areas, also the shooting information is clearly displayed.\\n\\n<b>Effortlessly capture stunning detail in any situation</b>\\nCapture vivid, detailed, high-resolution images with better dynamic range, lower noise and excellent control over depth of field thanks to a 24.2 Megapixel APS-C sensor.\\n\\n<b>19 all cross-type AF points for accurate subject tracking</b>\\nKeep track of fast moving action thanks to a fast and accurate autofocus system comprising 19 cross-type AF points.\\n\\n<b>Fast processor for action</b>\\nA powerful DIGIC 6 processor delivers full resolution shooting at 5 fps � so you�ll never miss that decisive moment.\\n\\n<b>Great low light shots</b>\\nTake memorable low light pictures without using flash thanks to a large ISO sensitivity range of ISO 100-12800 (extendable to ISO 25600)\\n\\n<b>Record cinematic Full HD movies as easily as you shoot stills</b>\\nShoot superbly detailed Full HD movies with a cinematic feel thanks to DSLR control over depth of field. Record your movies in MP4 format for quicker online sharing and easier transfer to other devices.\\n\\n<b>Smoother results</b>\\nEasily shoot cinematic Full HD movies with Hybrid CMOS AF III to track movement and focus smoothly between subjects.\\n\\n<b>Empower your creativity with easy shooting modes</b>\\nLet the camera do the work for you and capture creative photos with ease using a range of Scene Modes\\n\\n<b>Creative movie modes</b>\\nExpand the range of shooting possibilities in movies with features like Miniature Effect in movie.\"",
        "shortDescription": "\"22.3 x 14.9mm CMOS, 24.2 megapixels, 3:2, DIGIC 6, LCD, ISO 12800, Full HD Movie, USB, HDMI mini, SD/SDHC/SDXC, Black\"",
        "summary": "\"Canon 750D + EF-S 18-55mm, EOS. Megapixel: 24.2 MP, Camera type: SLR Camera Kit, Sensor type: CMOS. Focal length range (f-f): 18 - 55 mm, Minimum focal length (35mm film equiv): 2.9 cm, Maximum focal length (35mm film equiv): 8.8 cm. Focus: TTL-CT-SIR, Closest focusing distance: 0.25 m. ISO sensitivity: 100, 6400, 12800, Auto, Light exposure modes: Auto, Manual, Light exposure control: Program AE. Fastest camera shutter speed: 1/4000 s, Slowest camera shutter speed: 30 s, Camera shutter type: Electronic\"",
        "shortSummary": "\"Canon EOS 750D + EF-S 18-55mm, ATW, Cloudy, Custom modes, Daylight, Flash, Fluorescent L, Shade, Tungsten, Food, Landscape, Sports, Movie, Single image, Slide show, Battery, SLR Camera Kit, TTL-CT-SIR\""
    },
    "category": null,
    "preview": {
        "id": 1,
        "highRes": "http://images.icecat.biz/img/norm/high/26171112-1991.jpg",
        "lowRes": "http://images.icecat.biz/img/norm/low/26171112-1991.jpg",
        "manual": ""
    }
}

所以,为了对这些进行排序,我使用map来创建一个这样的简单数组:

// Create our mapped array
var mapped = array.map(function (a, i) {

    // Create our object
    var obj = {
        index: i,
        name: a.details.title
    };

    // Return our object
    return obj;
});

然后排序

mapped.sort();

一旦排序,我有一个如下所示的数组:

var mapped = [{
    name: 'test1',
    index: 4
}, {
    name: 'test2',
    index: 0
}, {
    name: 'test3',
    index: 3
}, {
    name: 'test4',
    index: 2
}, {
    name: 'test5',
    index: 1
}];

所以现在我想要重新组织 产品数组的已排序映射数组。 目前(这似乎是人们感到困惑的地方)我使用:

// Get our result
var result = mapped.map(function (item) {
    return products[item.index];
});

但是这会创建一个 new 数组。我不想要新阵列,我想重新排序(不排序)现有的产品数组。

希望这能解释我想要实现的目标。

1 个答案:

答案 0 :(得分:0)

我认为我的问题的答案是:

// Loop through our mapped items
mapped.forEach(function (mappedItem, i) {

    // Get our item by the index
    var item = array[mappedItem.index];

    // Update the index
    item.index = i;
});

// Sort our items
array.sort(function (a, b) {

    // Return our value
    return a.index === b.index ? 0 : a.index < b.index ? -1 : 1;
});