通过切片

时间:2016-11-29 06:32:44

标签: javascript jquery arrays json

我有一个十二项的数组:

 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 需要删除。

其他

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

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

4 个答案:

答案 0 :(得分:1)

您可以使用过滤器功能使用vanilla Javascript来执行此操作:



var arrToIterate = [{
  name: 'Iron'
}, {
  name: 'Iron'
}, {
  name: 'Iron'
}, {
  name: 'Manganese'
}, {
  name: 'Iron'
}, {
  name: 'Iron'
}, {
  name: 'Iron'
}, {
  name: 'ContainsSteel'
}];

filterArray(arrToIterate);

function filterArray(arrToIterate) {
  var containsSteel = false,
    containsIron = false,
    filteredArray;
  arrToIterate.forEach(function(item) {
    (item.name === 'ContainsSteel') ? containsSteel = true: null;
    (item.name === 'ContainsIron') ? containsIron = true: null;
  });

  console.log("Original Array");
  console.log(arrToIterate);
  console.log("ContainsSteel " + containsSteel);
  console.log("ContainsIron " + containsIron);
  if (containsSteel) {
    filteredArray = arrToIterate.filter(function(item) {
      return !(item.name === 'ContainsSteel');
    });
  }

  if (containsIron) {
    filteredArray = filteredArray.filter(function(item) {
      return !(item.name === 'ContainsIron');
    });
  }

  if (!(containsIron)) {
    filteredArray = filteredArray.filter(function(item) {
      return !(item.name === 'iron');
    })
  }

  if (!(containsSteel)) {
    filteredArray = filteredArray.filter(function(item) {
      return !(item.name === 'Steel');
    })
  }
  console.log("Filtered array ");
  console.log(filteredArray);
  return filteredArray;
};




答案 1 :(得分:1)

这是一个简单的版本。首先,你需要创建一个删除函数,如果它在那里删除了一些东西,还有一个删除命名金属的函数:

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");

Here it is as a fiddle

答案 2 :(得分:1)

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

var arrToIterate = [
   { Name: 'Iron' },
   { Name: 'Steel' },
   { Name: 'ContainsIron' },
   { Name: 'Manganese' },
   { Name: 'Magnesium' }
 ];

var result = arrToIterate.filter(function(metal) {
  return metal.Name in this ? this[metal.Name] : true; // if there's an entry in the hash (this) use it. If not keep the item.  
}, arrToIterate.reduce(function(hash, metal) { // create the hash
  if(metal.Name.indexOf('Contains') !== -1) { // if there's a contain rule
    hash[metal.Name] = false; // remove the rule
    hash[metal.Name.replace('Contains', '')] = true; // show the metal
  }

  return hash;
}, { Iron: false, Steel: false })) // the baseline is false for every metal with a Contain rule

console.log(result);

答案 3 :(得分:0)

如果您只想过滤数组,可以使用过滤器:

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

var filtered = array.filter(function(item) {
    return item.name === 'Iron'; 
})

不确定您的选择标准是什么,但您只需要在过滤器回调的正文中定义这些标准。

修改

我看到你更新了你的标准 - 所以你必须相应地修改过滤器回调,因为我认为其他响应者现在已经指出了。