简体   繁体   中英

removing multiple arrays from a 2D array

My web app is taking in arbitrarily large 2D arrays that sometimes look something like this:

var multiArray = [["","","",""],[1,2,3],["hello","dog","cat"],["","","",""]];

I want to write a function to take out every array inside of multiArray that is comprised entirely of quotes. In other words, any array that looks like this:

["","","",""]

should be deleted from multiArray.

I tried writing the following function, but the problem with using splice in a for loop is that splicing will change the length of the array, and I end up trying to access undefined elements. Please help!

Thanks!

Here's the incorrect function I wrote:

function cleanWhitespace(arrayOfArrays) {
    var i;
    var arrayOfArraysLength = arrayOfArrays.length;
    for (i = 0; i < arrayOfArraysLength; i++) {
        var cleanedArray = $.grep(arrayOfArrays[i], function(element) {
                                return element != ""
                            });
        if (cleanedArray.length == 0)  {
            arrayOfArrays.splice(i, 1);
        }
    }
    return arrayOfArrays;
};

You can use $.grep :

multiArray = $.grep(multiArray, function(v){
    return v.join('');
});

Fiddle : http://jsfiddle.net/scZcB/

on the fly:

var multiArray = [["","","",""],[1,2,3],["hello","dog","cat"],["","","",""]];
var outputArr = removeQuoteArrays(multiArray);
console.log(outputArr);

function removeQuoteArrays(arr) {
    var outputArr = [];

    for (var i = 0; i < arr.length; i++) {
        var currArr = arr[i];
        var isAllQuotes = true;
        for (var j = 0; j < currArr.length; j++) {
            if (currArr[j] != "") {
                isAllQuotes = false;
                break;
            }
        }

        if (!isAllQuotes) {
            outputArr.push(currArr);
        }
    }
    return outputArr;
}

Here's a JSFiddle .

Create a new array instead.

// Only add if...
cleanedArray = multiArray.filter(function(arr){
    // Some elements are not blank
    return arr.some(function(e){ return e !== "" }) 
})

I added a length check to your function to break out of the loop if the index reaches the array length:

if (i >= arrayOfArrays.length)
      break;

Which makes:

function cleanWhitespace(arrayOfArrays) {
    var i;
    var arrayOfArraysLength = arrayOfArrays.length;
    for (i = 0; i < arrayOfArraysLength; i++) {
        var cleanedArray = $.grep(arrayOfArrays[i], function(element) {
                                return element != ""
                            });
        if (cleanedArray.length == 0)  {
            arrayOfArrays.splice(i, 1);
            if (i >= arrayOfArrays.length)
                break;
        }
    }
    return arrayOfArrays;
};
var multiArray = [["","","",""],[1,2,3],["hello","dog","cat"],["","","",""]];

function cleanWhitespace(arrayOfArrays) {
    for (var i = 0; i < arrayOfArrays.length; i++) {
        var emptyElements = 0;

        for (var j = 0; j < arrayOfArrays[i].length; j++ ) {
            if (arrayOfArrays[i][j] === "") {
                emptyElements++;
            }
        }

        if (emptyElements === arrayOfArrays[i].length) {
            arrayOfArrays.splice(i, 1);
        }
    }

    return arrayOfArrays;
}

console.log(cleanWhitespace(multiArray));

http://jsfiddle.net/4Jfr9/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM