Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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_Arrays_Sorting_Date - Fatal编程技术网

Javascript 根据日期对对象数组进行排序

Javascript 根据日期对对象数组进行排序,javascript,arrays,sorting,date,Javascript,Arrays,Sorting,Date,从上面的对象数组中,我需要根据日期对它们进行排序,并获得如下输出 [ 0: {date: "02-04-2020", count: 1} 1: {date: "16-04-2020", count: 2} 2: {date: "10-04-2020", count: 1} 3: {date: "15-04-2020", count: 4} 4: {date: "04-04-2020", count: 4} ] 我试着用下面的方法 [ 0: {date: "02-04-2020"

从上面的对象数组中,我需要根据日期对它们进行排序,并获得如下输出

[
0: {date: "02-04-2020", count: 1}
1: {date: "16-04-2020", count: 2}
2: {date: "10-04-2020", count: 1}
3: {date: "15-04-2020", count: 4}
4: {date: "04-04-2020", count: 4}
]
我试着用下面的方法

    [
    0: {date: "02-04-2020", count: 1}
    1: {date: "04-04-2020", count: 4}
    2: {date: "10-04-2020", count: 1}
    3: {date: "15-04-2020", count: 4}
    4: {date: "16-04-2020", count: 2}
    ]
我在排序之前使用了.slice,因为我得到的错误是无法分配给对象“[object Array]的只读属性“0”,所以我引用并添加了slice


但是排序不正确,我需要一些帮助来解决这个问题。谢谢。

您可能会遇到新日期的问题。。。不处理此格式的字符串,因为它不是标准格式。新日期02-04-2020将其解释为2020年2月4日,新日期16-04-2020将产生错误。这里似乎使用的是美国的日期格式,我们向后使用的是前一个月的日期

如果您的日期格式为yyyy mm dd,则新日期。。。这会正常工作,所以如果你能改变这一点,这将是最顺利的路线。如果你不能改变格式,你会想考虑改变排序:
const sorted_array = data
          .slice()
          .sort(
            (a, b) => new Date(a.date).valueOf() - new Date(b.date).valueOf()
          );
如果不想删除排序列,可以跳过最后一步

更新

如果您需要保留对象原型,那么正确地指出,扩展语法破坏了这一点。我实际上更喜欢的另一种方法是将排序列存储在单独的映射中。它被存储的原因是为了避免需要多次计算排序键

const sorted_array = data
  .map(addSortableColumn)
  .sort(bySortColumn)
  .map(removeSortableColumn);

function addSortableColumn(item) {
  const [day, month, year] = item.date.split('-');
  return { ...item, _sortBy: year + month + day };
}

function bySortColumn(a, b) {
  return a._sortBy.localeCompare(b._sortBy);
}

function removeSortableColumn(item) {
  const { _sortBy, ...otherProps } = item;
  return otherProps;
}

您可能会遇到新日期的问题。。。不处理此格式的字符串,因为它不是标准格式。新日期02-04-2020将其解释为2020年2月4日,新日期16-04-2020将产生错误。这里似乎使用的是美国的日期格式,我们向后使用的是前一个月的日期

如果您的日期格式为yyyy mm dd,则新日期。。。这会正常工作,所以如果你能改变这一点,这将是最顺利的路线。如果你不能改变格式,你会想考虑改变排序:
const sorted_array = data
          .slice()
          .sort(
            (a, b) => new Date(a.date).valueOf() - new Date(b.date).valueOf()
          );
如果不想删除排序列,可以跳过最后一步

更新

如果您需要保留对象原型,那么正确地指出,扩展语法破坏了这一点。我实际上更喜欢的另一种方法是将排序列存储在单独的映射中。它被存储的原因是为了避免需要多次计算排序键

const sorted_array = data
  .map(addSortableColumn)
  .sort(bySortColumn)
  .map(removeSortableColumn);

function addSortableColumn(item) {
  const [day, month, year] = item.date.split('-');
  return { ...item, _sortBy: year + month + day };
}

function bySortColumn(a, b) {
  return a._sortBy.localeCompare(b._sortBy);
}

function removeSortableColumn(item) {
  const { _sortBy, ...otherProps } = item;
  return otherProps;
}

您的日期格式不正确。 DD-MM-YYYY不是有效的日期格式

const sortKeys = new Map();

const sorted_array = data.slice().sort(byDDMMYYYY);

function byDDMMYYYY(a, b) {
  return getSortKey(a).localeCompare(getSortKey(b));
}

function getSortKey(item) {
  let key = sortKeys.get(item);
  if (!key) {
    const [day, month, year] = item.date.split('-');
    key = year + month + day;
    sortKeys.set(item, key);
  }
  return key;
}
将返回无效日期

您需要将日期转换为ISO日期格式YYYY-MM-DD

常量数据=[ {id:02-04-2020,计数:1}, {id:16-04-2020,计数:2}, {id:10-04-2020,计数:1}, {id:15-04-2020,计数:4}, {id:04-04-2020,计数:4}, ]; console.logOriginal数据:,数据; //差不多吧。 const dataSorted=data.slice.sorta,b=>{ const[dayA,monthA,yearA]=a._id.split-; 常数[dayB,monthB,yearB]=b.\u id.split-; 返回新日期`${yearA}-${monthA}-${dayA}` -新日期`${yearB}-${monthB}-${dayB}` };
console.logData按日期排序:,数据排序 您的日期格式不正确。 DD-MM-YYYY不是有效的日期格式

const sortKeys = new Map();

const sorted_array = data.slice().sort(byDDMMYYYY);

function byDDMMYYYY(a, b) {
  return getSortKey(a).localeCompare(getSortKey(b));
}

function getSortKey(item) {
  let key = sortKeys.get(item);
  if (!key) {
    const [day, month, year] = item.date.split('-');
    key = year + month + day;
    sortKeys.set(item, key);
  }
  return key;
}
将返回无效日期

您需要将日期转换为ISO日期格式YYYY-MM-DD

常量数据=[ {id:02-04-2020,计数:1}, {id:16-04-2020,计数:2}, {id:10-04-2020,计数:1}, {id:15-04-2020,计数:4}, {id:04-04-2020,计数:4}, ]; console.logOriginal数据:,数据; //差不多吧。 const dataSorted=data.slice.sorta,b=>{ const[dayA,monthA,yearA]=a._id.split-; 常数[dayB,monthB,yearB]=b.\u id.split-; 返回新日期`${yearA}-${monthA}-${dayA}` -新日期`${yearB}-${monthB}-${dayB}` };
console.logData按日期排序:,数据排序 请参阅@Jacob的答案,以了解您错误的解释。下面是一个使用正则表达式将日期更改为正确格式的替代解决方案:

new Date("15-04-2020")
还请注意,您不需要比较日期中的valueOf,算术已经为Date重载,以允许对象的本机比较


编辑:将repl更改为YYYY-MM-DD的ISO 8601兼容格式。

请参阅@Jacob的答案,以了解错误的解释。下面是一个使用正则表达式将日期更改为正确格式的替代解决方案:

new Date("15-04-2020")
还请注意,您不需要比较日期中的valueOf,算术已经为Date重载,以允许对象的本机比较


编辑:将repl更改为ISO 8601兼容格式的YYYY-MM-DD。

为什么您的数组中有密钥?属性日期或_id?日期,sry I刚更改。为什么您的数组中有密钥?属性日期或_id?日期,sry I刚更改。我建议repl=$3-$2-$1;相反,由于这是官方支持的格式。特别是ISO 8601,而新的Datea.date.replacepattern、repl在本例中起作用,因此它的解析不正确,因为它将日期视为UTC。创建Dat
e是不必要的,将$3-$2-$1作为字符串进行比较就足够了,而且可能更有效-我建议repl=$3-$2-$1;相反,由于这是官方支持的格式。特别是ISO 8601,而新的Datea.date.replacepattern、repl在本例中起作用,因此它的解析不正确,因为它将日期视为UTC。没有必要创建日期,将$3-$2-$1作为字符串进行比较就足够了,而且可能更有效-太好了,非常感谢你的解释-太好了,非常感谢你的解释-