Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.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_Angular_Immutability_Ecmascript 2016 - Fatal编程技术网

Javascript 如何将排序后的数据分配给不可变对象

Javascript 如何将排序后的数据分配给不可变对象,javascript,angular,immutability,ecmascript-2016,Javascript,Angular,Immutability,Ecmascript 2016,我从ngrx/store获取数据,该数据在前端排序。当数据排序后,我将赋值回value,但没有更新发生。我知道数据是不可变的。但是如何将该值赋回到不可变的 这是我的尝试:this.data-排序后未更新 this.data = this.data.slice().sort((a, b) => { if (this.sort) { if (isNaN(a)) { if (a[sortBy] < b[sortBy]) { return -1;

我从
ngrx/store
获取数据,该数据在前端排序。当数据排序后,我将赋值回value,但没有更新发生。我知道数据是不可变的。但是如何将该值赋回到
不可变的

这是我的尝试:
this.data
-排序后未更新

this.data = this.data.slice().sort((a, b) => {
  if (this.sort) {
    if (isNaN(a)) {
      if (a[sortBy] < b[sortBy]) {
        return -1;
      }
    }
    if (!isNaN(a)) {
      return a[sortBy] - b[sortBy];
    }
  }
  if (!this.sort) {
    if (isNaN(a)) {
      if (b[sortBy] < a[sortBy]) {
        return -1;
      }
    }
    if (!isNaN(a)) {
      return b[sortBy] - a[sortBy];
    }
  }
});
this.data=this.data.slice().sort((a,b)=>{
if(this.sort){
if(isNaN(a)){
if(a[sortBy]
在这种情况下,您可以通过
管道
使用
排序。下面是一个可以帮助您解决问题的代码。下面的代码能够处理
数字、字符串、对象的数组
您可以传递一个需要应用排序的键。如果需要,也可以按相反顺序排序

同样,通过这种方式,您无需修改数据和重新分配。管道和角度将根据传递的输入进行排序,并在UI上显示。您可以在代码中使用此管道

import {
  Pipe,
  PipeTransform
} from "@angular/core";

@Pipe({
  name: "sortBy"
})
export class ArraySortByPipe implements PipeTransform {
  public transform(array: any[], reverse: boolean = false, prop ? : string) {
    if (!Array.isArray(array)) {
      return array;
    }
    if (array.length) {
      let sortedArray: any[];
      if (typeof array[0] === "string") {
        sortedArray = array.sort();
      }
      if (typeof array[0] === "number") {
        sortedArray = array.sort((a, b) => a - b);
      }
      if (typeof array[0] === "object" && prop) {
        sortedArray = array.sort((a, b) => a[prop].toString().localeCompare(b[prop].toString()));
      }
      return !reverse ? sortedArray : sortedArray.reverse();
    }
    return array;
  }
}

希望这有帮助:)。如果您仍然面临任何问题,请告诉我。

在这种情况下,您可以通过
管道
使用
。下面是一个可以帮助您解决问题的代码。下面的代码能够处理
数字、字符串、对象的数组
您可以传递一个需要应用排序的键。如果需要,也可以按相反顺序排序

同样,通过这种方式,您无需修改数据和重新分配。管道和角度将根据传递的输入进行排序,并在UI上显示。您可以在代码中使用此管道

import {
  Pipe,
  PipeTransform
} from "@angular/core";

@Pipe({
  name: "sortBy"
})
export class ArraySortByPipe implements PipeTransform {
  public transform(array: any[], reverse: boolean = false, prop ? : string) {
    if (!Array.isArray(array)) {
      return array;
    }
    if (array.length) {
      let sortedArray: any[];
      if (typeof array[0] === "string") {
        sortedArray = array.sort();
      }
      if (typeof array[0] === "number") {
        sortedArray = array.sort((a, b) => a - b);
      }
      if (typeof array[0] === "object" && prop) {
        sortedArray = array.sort((a, b) => a[prop].toString().localeCompare(b[prop].toString()));
      }
      return !reverse ? sortedArray : sortedArray.reverse();
    }
    return array;
  }
}

希望这有帮助:)。如果您仍然面临任何问题,请告诉我。

要确认,
此。数据是不可变的类型吗?是
列表吗
?我建议您使用管道对记录进行排序。。用谷歌搜索你会发现很多…@JonE-是的,你是correct@Manish-排序在这里是参数。我使用多个组件作为reusable@3gwebtrain即使sortyBy是一个参数,您也可以使用管道..来确认,
this.data
是一个不可变的类型吗?是
列表吗
?我建议您使用管道对记录进行排序。。用谷歌搜索你会发现很多…@JonE-是的,你是correct@Manish-排序在这里是参数。我使用多个组件作为reusable@3gwebtrain即使sortyBy是一个参数,您也可以使用管道..我们如何在ngrx中使用它?@profiler尚未尝试使用ngrx。如果你面临问题,请告诉我。。我会想办法在ngrx中如何使用它?@profiler还没有尝试过使用ngrx。如果你面临问题,请告诉我。。我会想出办法的