加入多个订单索引数组

时间:2017-03-06 22:05:18

标签: javascript arrays indexing

我有多个索引数组,代表一个顺序:

[[0,1,2], [2,0,1], [1,2,0], [0,1,2], ...]

我需要构造一个新的索引数组,其长度等于输入中索引的总数,同时使用输入中每个数组中指示的位置对值进行排序。

这将是上面输入的输出:

[0, 1, 2, 5, 3, 4, 7, 8, 6, 9, 10, 11, ...]
  • 总长度为12,因此索引列表将包含0-11
  • 输入的第一个数组是0,1,2,因此输出以0,1,2
  • 开始
  • 输入的第二个数组是2,0,1,新列表中接下来的3个索引是3-5。使用输入的第二个数组对这些进行排序,结果为5,3,4
  • 依旧......

4 个答案:

答案 0 :(得分:1)

我对你的例子很困惑,但听起来你想要将你的数组压平一层。你可以这样做:

    package com.example.crud;

import java.text.SimpleDateFormat;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.example.crud.entities.Users;
import com.example.crud.service.TaskService;

@Controller
public class HomeController {

    @Autowired
    private TaskService service;
    private Logger logger = LoggerFactory.getLogger(HomeController.class);

    @InitBinder
    public void initBinder(WebDataBinder binder){
        System.out.println("exe");
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(true);
        binder.registerCustomEditor(java.sql.Date.class,"DateOfBirth", new CustomDateEditor(sdf, true));
    }
    @RequestMapping(value="/Add", method=RequestMethod.GET)
    public String index(Map<String, Object> model){
        Users users = new Users();
        model.put("users", users);
        logger.debug("users");
        return "home";
    }

    @RequestMapping(value="/Register", method=RequestMethod.POST)
    public String Register(@ModelAttribute("users") Users users, BindingResult result, Model model){
        System.out.println(users.getFirst_Name());
        System.out.println(users.getDateOfBirth());
//      service.Register(users);
        return "home";
    }

}

如果您使用的是像Underscore这样的库,那么有一些内置方法可以做到这一点,例如flatten method

答案 1 :(得分:1)

您可以使用Array#reduceArray#forEach以及实际数组的长度来计算。然后将所有长度的总和推送到结果集。

&#13;
&#13;
var array = [[0, 1, 2], [2, 0, 1], [1, 2, 0], [0, 1, 2]],
    result = [];

array.reduce(function (r, a) {
    a.forEach(function (b) {
        result.push(r + b);
    });
    return r + a.length;
}, 0);

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 2 :(得分:0)

输入和输出示例令人困惑,但我想你想要它:

var array = [...] // your array
var result = Array.prototype.concat.apply([], array);

答案 3 :(得分:0)

我相信我会根据预期的输出解释您的问题,并相应地编辑问题。

您需要循环输入中的子数组并获取输出的下一组索引,然后使用子数组的顺序将这些索引添加到输出中。

这似乎可以解决问题:

var input = [[0, 1, 2], [2, 0, 1], [1, 2, 0], [0, 1, 2]];

var output = [];

// add values to the output for each of the inputs
$.each(input, function (index, value) {
    // get the next and last values to add
    var startIndex = output.length;
    var lastIndex = (startIndex + value.length) - 1;

    // make an array of sequential values from startIndex to lastIndex
    var arrayToAdd = [];
    for (var i = startIndex; i <= lastIndex; i++) {
        arrayToAdd.push(i);
    }

    // add the values from arrayToAdd in the order of the indexes in the input
    $.each(value, function (innerindex, innerindexvalue) {
        output.push(arrayToAdd[innerindexvalue]);
    });

});

console.log(output);