簡體   English   中英

如何根據數組內容添加/刪除數組中的元素

[英]How to add/remove elements from array based on array contents

我已經在這篇文章中苦苦掙扎了幾天,我似乎無法找到錯誤。 我有一個包含幾個對象的數組:

myMainPostObj.categories = [Object, Object]

這是為帖子添加/刪除類別。 想象一下,我正在編輯一個已經與幾個類別相關聯的現有帖子(根據上面的代碼)。

我還有一個數組,其中包含數據庫中的所有類別(包括與帖子相關的類別)。 在我的js控制器上,我有以下代碼:

$scope.addCategory = function (cat) {
    for (var i in $scope.post.category_ids) {
        if (cat._id === $scope.post.category_ids[i]) {
            $scope.post.category_ids.slice(i, 1);
        } else if (cat._id !== $scope.post.category_ids[i]) {
            $scope.post.category_ids.push(cat._id);
        }
    }
}

每次用戶單擊類別時都會調用上述函數。 我們的想法是讓上面的函數循環遍歷帖子中的類別(與帖子相關聯),並將其與作為參數傳遞的類別進行比較。 如果匹配該功能應刪除該類別。 如果沒有,則應添加。

從理論上講,這似乎很直接,但無論出於何種原因,如果我勾選與帖子無關的類別,它會向數組添加兩個(不是預期的)類別。 當我嘗試刪除時也會發生同樣的情況。

這是Angular控制器的一部分,整個代碼可以在這里找到

我想問題可能是你在使用for循環迭代它時改變了category_ids數組。 嘗試這樣的事情可能會更好:

$scope.addCategory = function (cat) {
var catIndex = $scope.post.category_ids.indexOf(cat._id);
if (catIndex > -1)
    $scope.post.category_ids.splice(catIndex, 1);
else
    $scope.post.category_ids.push(cat._id);
}

請注意,IE7-8似乎不支持indexOf。

讓我們簡化一下:

const CATEGORIES = [1, 2, 3];

let addCategory = (postCategories, categoryId) => {
  CATEGORIES.forEach((cId, index) => {
    if (postCategories[index] === cId) console.log("Removing", categoryId);
    else console.log("Adding", categoryId);
  });
  return postCategories;
};

請忽略我們實際上沒有改變傳入的數組的事實。

A等於或不等於B - 沒有第三個選項(除了FILE_NOT_FOUND )。 因此,您循環遍歷所有類別,並且每次在當前索引處的陣列中找不到類別ID時, 都會將其添加到postCategories數組中

解決問題的正確方法就是使用Set (或者如果你需要的不僅僅是前沿的ES6支持,一個沒有原型的對象):

// Nicer, ES6-or-pollyfill option
var postCategories = new Set();
postCategories.add(categoryId);

// Or, in the no-prototype option:
var postCategories = Object.create(null);
postCategories[categoryId] = true;
// Then serialization needs an extra step if you need an array:
parentObject.postCategories = Object.keys(parentObject.postCategories);

代碼中的錯誤是,對於循環的每次迭代,您要么刪除或添加類別。 這不對......如果當前的id匹配,你應該刪除,但只有在根本沒有匹配時才添加。 像這樣的東西:

$scope.addCategory = function (cat) {
    var found = false;
    for (var i in $scope.post.category_ids) {
        if (cat._id === $scope.post.category_ids[i]) {
            $scope.post.category_ids.splice(i, 1);   // splice, not slice
            found = true;
        } 
    }
    if (!found)  // add only if it wasn't found
        $scope.post.category_ids.push(cat._id);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM