根据键映射2个数组

时间:2016-08-13 10:50:30

标签: javascript arrays javascript-objects

我有一个包含一些日期和值的数组。例如:在日期x我们有20个订单,在日期y我们有32个订单。

[2016-08-09: 38, 2016-08-08: 75, 2016-08-05: 13, 2016-08-04: 23, 2016-08-03: 10]

第二个数组是一个包含上个月所有日期的数组。例如:

["2016-07-14", "2016-07-15", "2016-07-16", "2016-07-17", "2016-07-18", "2016-07-19", "2016-07-20", "2016-07-21", "2016-07-22", "2016-07-23", "2016-07-24", "2016-07-25", "2016-07-26", "2016-07-27", "2016-07-28", "2016-07-29", "2016-07-30", "2016-07-31", "2016-08-01", "2016-08-02", "2016-08-03", "2016-08-04", "2016-08-05", "2016-08-06", "2016-08-07", "2016-08-08", "2016-08-09", "2016-08-10", "2016-08-11", "2016-08-12", "2016-08-13"]

然后我尝试映射这个数组并检查日期是否为空,写“”否则写入在第一个数组中找到的值。

        var totalInputOrders = allDates.map(function(date) {
          return [ date, inputOrdersCount[date] ? "" : inputOrdersCount[date] ];
      });

它将为我提供一个31长度数组,其数组元素具有2个值。日期=>值。如果在第一个数组中找不到日期,则会写入“”,但是他找不到第一个数组中的值。我在哪里错了?

2 个答案:

答案 0 :(得分:2)

首先,根据your comment的问题,按照您的预期进行此项工作:

  

我期待:[[2016-08-10, ""], [2016-08-09, 38], [2016-08-08, 75], [2016-08-07, ""], [2016-08-06, ""], [2016-08-05, 13]]等等......

我建议采用以下方法:

// using an Object, in place of an Array, to associate
// dates with order-counts, and wrapping the dates in
// quotes (otherwise you have invalid syntax [1], hyphens
// cannot be used unquoted in variable names even if
// wrapped in parentheses to attempt to have the result
// of a mathematical expression be used as the key [2]):
var inputOrdersCount = {
    "2016-08-09": 38,
    "2016-08-08": 75,
    "2016-08-05": 13,
    "2016-08-04": 23,
    "2016-08-03": 10
  },

  // no changes to this Array:
  allDates = ["2016-07-14", "2016-07-15", "2016-07-16", "2016-07-17", "2016-07-18", "2016-07-19", "2016-07-20", "2016-07-21", "2016-07-22", "2016-07-23", "2016-07-24", "2016-07-25", "2016-07-26", "2016-07-27", "2016-07-28", "2016-07-29", "2016-07-30", "2016-07-31", "2016-08-01", "2016-08-02", "2016-08-03", "2016-08-04", "2016-08-05", "2016-08-06", "2016-08-07", "2016-08-08", "2016-08-09", "2016-08-10", "2016-08-11", "2016-08-12", "2016-08-13"],

  // using Array.prototype.map() to iterate over the allDates
  // Array:
  totalInputOrders = allDates.map(function(date) {
    // 'date', the first argment, is a reference to
    // the current array-element of the Array over
    // which we're iterating.

    // here we return an Array with the current
    // array-element as the first array-element
    // of the created-Array, and the second value
    // determined by the existence of a result
    // from the inputOrdersCount Object using
    // the current array-element as the key; if
    // there is a result we use that result, if
    // no result (undefined) then we use an
    // empty string:
    return [date, (inputOrdersCount[date] ? inputOrdersCount[date] : "")];
  });

// logging the full totalInputOrders Array, and the filtered
// totalInputOrders Array, returning only those Array-elements
// that do not have an empty String as the second array-element:
console.log(totalInputOrders, totalInputOrders.filter(function(arr) {
  return arr[1] !== "";
}));

JS Fiddle demo

现在,您的代码无法按预期工作的原因:

  1. [2016-08-09: 38, 2016-08-08: 75, 2016-08-05: 13, 2016-08-04: 23, 2016-08-03: 10]这是一个语法错误,数组值 - 这是一个数组,而不是一个对象 - 需要引用,否则我们最终会得到{{1}的错误} 3

  2. 当您尝试使用非数字数组元素作为访问另一个数组中保存的值的键时,这将返回未定义的值,因为您尝试访问的数组可以被访问使用相同的表示法,但使用数字索引,例如"Uncaught SyntaxError: Unexpected token :"(这将导致inputOrdersCount[0](你引用了你的数组元素)。而你想要到什么retrieve是"2016-08-09: 38",这需要38成为一个Object,因此我在上面的演示中将Array更改为Object。

  3. 您的条件(三元)运算符错误;你应该做的是 - 如果你的inputOrdersCount检查得到肯定的结果 - 然后你返回那个结果,如果检查没有结果你返回空字符串。不幸的是,考虑到你的语句的顺序,你做的恰恰相反:当检查为正时返回一个空字符串并提供一个未定义的结果(如果没有正,真或真结果,则返回相同的inputOrdersCount[date]结果。三元的顺序很重要,遵循以下模式:

    inputOrdersCount[date]

    所以你应该写一下:

    assessment ? ifTrue : ifFalse;
    
  4. 参考文献:

    脚注:

    1. 使用变量名称中的连字符重现语法错误:https://jsfiddle.net/davidThomas/842q0s89/1/
    2. 语法错误的再现,使用括号尝试将和的结果用作对象键:https://jsfiddle.net/davidThomas/842q0s89/2/
    3. 错误的再现,inputOrdersCount[date] ? inputOrdersCount[date] : "";

答案 1 :(得分:0)

如果您需要将字符串数组转换为对象以便能够执行inputOrdersCount[date],您可以像这样使用reduce



var inputOrdersCount = ["2016-08-09: 38", "2016-08-08: 75", "2016-08-05: 13", "2016-08-04: 23", "2016-08-03: 10"];

inputOrdersCount = inputOrdersCount.reduce(function(counter, item) {
  var split = item.split(/: ?/);
  counter[split[0]] = parseInt(split[1], 10);
  return counter;
}, {});

console.log(inputOrdersCount);