【问题标题】:Splicing Array Based on For Loop Iteration基于For循环迭代的拼接数组
【发布时间】:2015-06-20 17:21:36
【问题描述】:

我正在尝试获取一个数组(“selectedWorkshops”),并将其中的对象移动到“registeredWorkshops”。然后,我还想从“selectedWorkshops”和另一个简称为“workshops”的数组中删除这些对象。

在此处查看我的代码笔:http://codepen.io/trueScript/pen/wBVqNN

数组:

var workshops = [
  {
    name: 'apples',
    WorkshopId: '19'
  },
  {
    name: 'oranges',
    WorkshopId: '3b'
  },
  {
    name: 'pears',
    WorkshopId: 'x6'
  },
  {
    name: 'pineapples',
    WorkshopId: '55'
  },
  {
    name: 'watermelons',
    WorkshopId: '8v'
  }
];

var selectedWorkshops = [
  {
    name: 'oranges',
    WorkshopId: '3b'
  },
  {
    name: 'watermelons',
    WorkshopId: '8v'
  },
  {
    name: 'pears',
    WorkshopId: 'x6'
  }
];

var registeredWorkshops = [];

应该将车间移动到“注册车间”并将其从“选定车间”和“车间”中删除的功能:

flipWorkshops = function(){
    var numberOfWorkshops = selectedWorkshops.length;
    var X = 1;
    for(var i = 0; i < numberOfWorkshops; i++ ){
        registeredWorkshops.push(selectedWorkshops[i]);
        for(var j = 0, arrayLength = workshops.length; j < arrayLength; j++) {
            var selectedWorkshop = selectedWorkshops[i];
            var originalWorkshop = workshops[j];
            if(selectedWorkshop == originalWorkshop){
                var matchingWorkshop = j;
                workshops = workshops.splice(j, 1);
                selectedWorkshops = selectedWorkshops.splice(i, 1);
            }
        }
    }
};
flipWorkshops();

为什么对象没有像应有的那样从“workshop”和“selectedWorkshops”数组中正确拼接出来?我做错了什么?

【问题讨论】:

  • "splice() 方法在数组中添加/删除项目,并返回删除的项目。" w3schools.com/jsref/jsref_splice.asp 所以,基本上,您将 workshops 简化为单个对象,即已删除的数组元素。

标签: javascript arrays object for-loop splice


【解决方案1】:

“splice() 方法在数组中添加/删除项目,并返回删除的项目。” http://w3schools.com/jsref/jsref_splice.asp 所以,基本上,您将研讨会减少到一个对象,即移除的数组元素。

改为:

workshops = workshops.splice(j, 1);
selectedWorkshops = selectedWorkshops.splice(i, 1);

...到:

workshops.splice(j, 1);
selectedWorkshops.splice(i, 1);

JSFiddle


也许这就是你想要的:

var registeredWorkshops = [];
var flipWorkshops = function(){
    var numberOfWorkshops = selectedWorkshops.length;
    var X = 1;
    for(var i = numberOfWorkshops - 1; i >= 0; i-- ){
        registeredWorkshops.push(selectedWorkshops[i]);
        var selectedWorkshop = selectedWorkshops[i];
        for(var j = workshops.length - 1; j >= 0; j--) {
            var originalWorkshop = workshops[j];
            if(selectedWorkshop.name == originalWorkshop.name &&
              selectedWorkshop.WorkshopId == originalWorkshop.WorkshopId){
                var matchingWorkshop = j;
                workshops.splice(j, 1);
                selectedWorkshops.splice(i, 1);
            }
        }
    }
};
flipWorkshops();

修复了splice,按照jwatts1980 的建议反转循环,将selectedWorkshop var 移出循环,并比较每个对象项,而不是比较对象,因为objects don't compare

JSFiddle Tweaked

JSFiddle Object Compare Example

【讨论】:

  • 嘿,我认为由于项目正在从数组中删除,for 循环也需要反向遍历。 for(var j = workshops.length - 1; j &gt;= 0; j--)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多