通过切片操作javascript中的数组

通过切片操作javascript中的数组,javascript,jquery,arrays,json,Javascript,Jquery,Arrays,Json,我有一个由12项组成的数组: var arrToIterate = []; arrToIterate = //Data from service to populate; 数组中的每个项目都有两个字段:名称和标题。 如果假设数组的名称为: Scenario 1: [0]: Name: Iron [1]: Name: Steel [2]: Name: ContainsIron [3]: Name: ContainsSteel [4]: Name : Manganese [5]

我有一个由12项组成的数组:

 var arrToIterate = [];
        arrToIterate = //Data from service to populate;
数组中的每个项目都有两个字段:名称和标题。

如果假设数组的名称为:

Scenario 1:
[0]: Name: Iron
[1]: Name: Steel
[2]: Name: ContainsIron
[3]: Name: ContainsSteel 
[4]: Name : Manganese
[5]: Name: Magnesium
我需要输出为:

[0]: Name: Iron
[1]: Name: Steel
[2]: Name : Manganese
[3]: Name: Magnesium



Scenario 2:
If suppose the array has Names as :
[0]: Name: Iron
[1]: Name: Steel
[2]: Name : Manganese
[3]: Name: Magnesium
I need the output as:

[0]: Name:  Manganese
[1]: Name: Magnesium
我正试图这样做:

$.each(arrToIterate, function (element, index, arr) {
                                    if (element.Name == "ContainsIron" || element.Name == "ContainsSteel") {
                                        arr.splice(index, 1);
                                    }
                                });
但我无法处理第二种情况。如何在这两种情况下实现阵列操纵

编辑:

如果数组包含“ContainsIron”,则需要删除ContainsIron,同样,如果数组包含ContainsSteel,则需要删除ContainsSteel

否则

如果数组不包含包含钢,则需要删除


如果数组不包含ContainsIron,则需要删除Iron。

您只需使用vanilla Javascript,使用过滤函数:

var arrToIterate=[{
名称:“铁”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“锰”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“集装箱钢”
}];
过滤阵列(棱纹);
函数过滤器阵列(arrToIterate){
var CONTAINSTEEL=错误,
containsIron=false,
滤光片;
arrToIterate.forEach(功能(项目){
(item.name=='ContainsSteel')?ContainsSteel=true:null;
(item.name=='ContainsIron')?ContainsIron=true:null;
});
log(“原始数组”);
控制台日志(arrToIterate);
控制台日志(“容器钢”+容器钢);
控制台日志(“ContainsIron”+ContainsIron);
if(含钢){
filteredArray=ArrtoItem.filter(函数(项){
return!(item.name==“containsssteel”);
});
}
if(siron){
filteredArray=filteredArray.filter(函数(项){
return!(item.name==“ContainsIron”);
});
}
如果(!(siron)){
filteredArray=filteredArray.filter(函数(项){
返回!(item.name=='iron');
})
}
如果(!(含钢)){
filteredArray=filteredArray.filter(函数(项){
返回!(item.name=='Steel');
})
}
log(“过滤数组”);
控制台日志(filteredArray);
返回过滤器阵列;

};您可以使用vanilla Javascript来完成此操作,使用filter函数:

var arrToIterate=[{
名称:“铁”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“锰”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“铁”
}, {
名称:“集装箱钢”
}];
过滤阵列(棱纹);
函数过滤器阵列(arrToIterate){
var CONTAINSTEEL=错误,
containsIron=false,
滤光片;
arrToIterate.forEach(功能(项目){
(item.name=='ContainsSteel')?ContainsSteel=true:null;
(item.name=='ContainsIron')?ContainsIron=true:null;
});
log(“原始数组”);
控制台日志(arrToIterate);
控制台日志(“容器钢”+容器钢);
控制台日志(“ContainsIron”+ContainsIron);
if(含钢){
filteredArray=ArrtoItem.filter(函数(项){
return!(item.name==“containsssteel”);
});
}
if(siron){
filteredArray=filteredArray.filter(函数(项){
return!(item.name==“ContainsIron”);
});
}
如果(!(siron)){
filteredArray=filteredArray.filter(函数(项){
返回!(item.name=='iron');
})
}
如果(!(含钢)){
filteredArray=filteredArray.filter(函数(项){
返回!(item.name=='Steel');
})
}
log(“过滤数组”);
控制台日志(filteredArray);
返回过滤器阵列;

};如果只想过滤阵列,可以使用过滤器:

var array = [
    { name: 'Iron'},
  { name: 'Steel'},
  { name: 'Manganese'},
  { name: 'Magnesium'}
];

var filtered = array.filter(function(item) {
    return item.name === 'Iron'; 
})
不确定您的选择条件是什么,但您只需要在过滤器回调的主体中定义这些条件

编辑


我看到您更新了条件-因此您只需按照我认为其他响应者现在指出的那样相应地修改筛选器回调。

如果您只想筛选数组,您可以使用筛选器:

var array = [
    { name: 'Iron'},
  { name: 'Steel'},
  { name: 'Manganese'},
  { name: 'Magnesium'}
];

var filtered = array.filter(function(item) {
    return item.name === 'Iron'; 
})
不确定您的选择条件是什么,但您只需要在过滤器回调的主体中定义这些条件

编辑


我看到你更新了你的标准-因此你只需按照我认为其他响应者现在指出的那样相应地修改过滤器回调。

这里是一个简单的版本。首先,您需要创建一个移除函数,用于移除其中的某个元素,以及一个移除命名金属的函数:

function removeIfExists(arr,name){

    // get the index of the entry:
    for(var i in arr){
        if(arr[i].Name==name){
            // Got it! Rip it out:
            arr.splice(i,1);
            return true;
        }
    }

    // Not in the array at all.
    return false;

}

// Removes a metal from the given array
function removeMetal(arr,name){

    // Try removing e.g. ContainsIron:
    if(!removeIfExists(arr,"Contains"+name)){
        // ContainsIron/ ContainsSteel wasn't in there. Try removing 'Iron'/ 'Steel':
        removeIfExists(arr,name);
    }

}
这使得用法仅限于:

removeMetal(arrToIterate,"Iron");
removeMetal(arrToIterate,"Steel");

这里有一个简单的版本。首先,您需要创建一个移除函数,用于移除其中的某个元素,以及一个移除命名金属的函数:

function removeIfExists(arr,name){

    // get the index of the entry:
    for(var i in arr){
        if(arr[i].Name==name){
            // Got it! Rip it out:
            arr.splice(i,1);
            return true;
        }
    }

    // Not in the array at all.
    return false;

}

// Removes a metal from the given array
function removeMetal(arr,name){

    // Try removing e.g. ContainsIron:
    if(!removeIfExists(arr,"Contains"+name)){
        // ContainsIron/ ContainsSteel wasn't in there. Try removing 'Iron'/ 'Steel':
        removeIfExists(arr,name);
    }

}
这使得用法仅限于:

removeMetal(arrToIterate,"Iron");
removeMetal(arrToIterate,"Steel");

由于“包含”规则缺乏一致性(例如,锰没有),我们需要定义一个哈希,如果没有包含规则,将不会显示什么内容。 之后,我们可以扫描数组中的“Contain”规则,更新散列,然后相应地过滤数组

var arrToIterate=[
{名称:'铁'},
{名称:'钢'},
{Name:'ContainsIron'},
{名称:'锰'},
{名称:'镁'}
];
var结果=阵列过滤器(功能(金属){
返回this中的metal.Name?this[metal.Name]:true;//如果散列(this)中有条目,则使用它。如果没有,则保留该条目。
}reduce(函数(散列,metal){//创建散列
if(metal.Name.indexOf('Contains')!=-1){//如果有包含规则
hash[metal.Name]=false;//删除规则
hash[metal.Name.replace('Contains','')=true;//显示金属
}
返回散列;
},{Iron:false,Steel:false}///对于包含规则的每种金属,基线都是假的

控制台日志(结果)因为“包含”规则缺乏一致性(例如,锰没有)