Rxjs 如何切换;订单“;此数组/列表中2项的属性? 类项目{ 名称:字符串; 顺序:编号; } 设onUp=new Rx.Subject(); let list=新的Rx.BehaviorSubject([ {名称:“7”,顺序:70}, {名称:“2”,顺序:20}, {名称:“5”,顺序:50}, {名称:“3”,顺序:30}, {名称:“4”,顺序:40}, {名称:“6”,顺序:60}, {名称:“1”,顺序:10} ]); list.subscribe(console.log); onUp.subscribe(anItem=>{ let numberList:项目[]; 列表 .采取(1) .map(x=>x.sort((a,b)=>a.order-b.order)) .subscribe(ddList=>(numberList=ddList)); 让index=numberList.indexOf(numberList.find(num=>num.order==anItem)); 设ddvalue=numberList[index]; 设preddvalue=numberList[index-1]; 让preddvalue order=preddvalue.order; preddvalue.order=ddvalue.order; ddvalue.order=preddvalue.order; 列表。下一个(数字列表); }); onUp.next(30);

Rxjs 如何切换;订单“;此数组/列表中2项的属性? 类项目{ 名称:字符串; 顺序:编号; } 设onUp=new Rx.Subject(); let list=新的Rx.BehaviorSubject([ {名称:“7”,顺序:70}, {名称:“2”,顺序:20}, {名称:“5”,顺序:50}, {名称:“3”,顺序:30}, {名称:“4”,顺序:40}, {名称:“6”,顺序:60}, {名称:“1”,顺序:10} ]); list.subscribe(console.log); onUp.subscribe(anItem=>{ let numberList:项目[]; 列表 .采取(1) .map(x=>x.sort((a,b)=>a.order-b.order)) .subscribe(ddList=>(numberList=ddList)); 让index=numberList.indexOf(numberList.find(num=>num.order==anItem)); 设ddvalue=numberList[index]; 设preddvalue=numberList[index-1]; 让preddvalue order=preddvalue.order; preddvalue.order=ddvalue.order; ddvalue.order=preddvalue.order; 列表。下一个(数字列表); }); onUp.next(30);,rxjs,Rxjs,与列表中的另一个对象交换“order”值的反应方式是什么 我有一大堆我应该可以重新订购的物品 项目的顺序基于项目列表中项目对象的order属性。 我通过切换两个项目的order属性对项目进行重新排序。 在示例代码中,onUp主题发出一个orderNumber,该orderNumber应与上面的项(ordered by order属性)切换 示例代码可以工作,只是因为第二个订阅是异步的,这可能是一种不好的做法。 另一种方法是在外部订阅中的订阅内部进行重新排序,但这也是一种不好的做法(不确定原因,除

与列表中的另一个对象交换“order”值的反应方式是什么

我有一大堆我应该可以重新订购的物品

项目的顺序基于项目列表中项目对象的order属性。 我通过切换两个项目的order属性对项目进行重新排序。 在示例代码中,onUp主题发出一个orderNumber,该orderNumber应与上面的项(ordered by order属性)切换

示例代码可以工作,只是因为第二个订阅是异步的,这可能是一种不好的做法。 另一种方法是在外部订阅中的订阅内部进行重新排序,但这也是一种不好的做法(不确定原因,除了它是一个混乱的嵌套)

我总是看到flatMap,但如果我理解正确,第二次订阅只使用第一次订阅中的数据来获取数据。
在这种情况下,我需要来自第一个和第二个主题的数据来获得要切换的两个项目和要推送到列表主题的新列表。

啊。。。。维护2个列表对您合适吗?一个是未排序的,另一个总是侦听未排序的更改并对其排序

const list=new Rx.BehaviorSubject([
{名称:“7”,顺序:70},
{名称:“2”,顺序:20},
{名称:“5”,顺序:50},
{名称:“3”,顺序:30},
{名称:“4”,顺序:40},
{名称:“6”,顺序:60},
{名称:“1”,顺序:10}
]);
const sortedList=新接收行为主体([]);
const onUp=新接收行为主体(0);
列表
.map(x=>x.sort((a,b)=>a.order-b.order))
.subscribe(x=>sortedList.next(x));
sortedList.subscribe(console.log);
onUp.subscribe(x=>{
const idx=sortedList.getValue()
.findIndex(itm=>itm.order==x);
如果(idx<1)返回;
const list=sortedList.getValue();
const prev=list[idx-1]。顺序;
const curr=列表[idx]。顺序;
列表[idx]。顺序=上一个;
列表[idx-1]。订单=curr;
分类列表。下一个(列表);
});
onUp.next(30);
onUp.next(70)
getValue()
行为主体
也是不好的做法(Ben Lesh在我的源代码中这样说)。在
上用latest from
combineLatest
读取组合两个观测值的信息

class item {
  name: string;
  order: number;
}
let onUp = new Rx.Subject<item>();
let list = new Rx.BehaviorSubject<item>([
  { name: "7", order: 70 },
  { name: "2", order: 20 },
  { name: "5", order: 50 },
  { name: "3", order: 30 },
  { name: "4", order: 40 },
  { name: "6", order: 60 },
  { name: "1", order: 10 }
]);
list.subscribe(console.log);
onUp.subscribe(anItem => {
  let numberList: item[];
  list
    .take(1)
    .map(x => x.sort((a, b) => a.order - b.order))
    .subscribe(ddList => (numberList = ddList));
  let index = numberList.indexOf(numberList.find(num => num.order == anItem));
  let ddvalue = numberList[index];
  let preddvalue = numberList[index - 1];

  let preddvalueOrder = preddvalue.order;
  preddvalue.order = ddvalue.order;
  ddvalue.order = preddvalue.order;

  list.next(numberList);
});

onUp.next(30);
类项目{
名称:字符串;
顺序:编号;
}
设onUp=new Rx.Subject();
let list=新的Rx.BehaviorSubject([
{名称:“7”,顺序:70},
{名称:“2”,顺序:20},
{名称:“5”,顺序:50},
{名称:“3”,顺序:30},
{名称:“4”,顺序:40},
{名称:“6”,顺序:60},
{名称:“1”,顺序:10}
]);
list.subscribe(console.log);
//onUp.subscribe(anItem=>{
onUp
.withLatestFrom(列表,(项目,项目列表)=>{
返回{item:item,itemList:itemList};
})
.订阅(itemWithList=>{
let numberList:item[]=itemWithList.itemList.sort(
(a,b)=>a.顺序-b.顺序
);
让orderToUp:number=itemWithList.item;
让index=numberList.findIndex(x=>x.order==orderToUp);
设ddvalue=numberList[index];
设preddvalue=numberList[index-1];
console.log(ddvalue);
让preddvalue order=preddvalue.order;
preddvalue.order=ddvalue.order;
ddvalue.order=preddvalue-order;
列表。下一个(数字列表);
});
onUp.next(30);
将其粘贴到此处:

资料来源:

谢谢你,@Chybie。但我真正想要的是切换数组中两个相邻对象的order属性。
class item {
  name: string;
  order: number;
}
let onUp = new Rx.Subject<item>();
let list = new Rx.BehaviorSubject<item[]>([
  { name: "7", order: 70 },
  { name: "2", order: 20 },
  { name: "5", order: 50 },
  { name: "3", order: 30 },
  { name: "4", order: 40 },
  { name: "6", order: 60 },
  { name: "1", order: 10 }
]);
list.subscribe(console.log);
// onUp.subscribe(anItem => {
onUp
  .withLatestFrom(list, (item, itemList) => {
    return { item: item, itemList: itemList };
  })
  .subscribe(itemWithList => {
    let numberList: item[] = itemWithList.itemList.sort(
      (a, b) => a.order - b.order
    );
    let orderToUp: number = itemWithList.item;

    let index = numberList.findIndex(x => x.order === orderToUp);
    let ddvalue = numberList[index];
    let preddvalue = numberList[index - 1];
    console.log(ddvalue);

    let preddvalueOrder = preddvalue.order;
    preddvalue.order = ddvalue.order;
    ddvalue.order = preddvalueOrder;

    list.next(numberList);
  });

onUp.next(30);