代码之家  ›  专栏  ›  技术社区  ›  JackJack

移除嵌套在对象内部的数组项

  •  2
  • JackJack  · 技术社区  · 6 年前

    我正在尝试基于数组中的标题属性从对象数组中移除特定项。我一直遇到一个问题,在这个问题中我可以查看数组项,但是我无法根据在remove函数中输入的参数将该项从数组中拼接出来。我只是从我的 else 函数中的语句。

    我试过用 find, forEach, findIndex 并匹配该情况,以测试是否根据索引或 key 'text' . 在搜索论坛建议的答案之前,我对所有尝试过的功能进行了评论。我所有的配方功能都在工作,还有我的 createIngredient 函数,它向配方数组添加一个对象。但是 removeIngredient 我一直在努力工作的函数,不是因为上面提到的问题。

    let recipes = []
    
    // Read existing recipes from localStorage
    const loadRecipes = () => {
        const recipesJSON = localStorage.getItem('recipes')
    
        try {
            return recipesJSON ? JSON.parse(recipesJSON) : []
        } catch (e) {
            return []
        } 
    }
    
    // Expose recipes from module
    const getRecipes = () => recipes
    
    const createRecipe = () => {
        const id = uuidv4()
        const timestamp = moment().valueOf()
    
        recipes.push({
            id: id,
            title: '',
            body: '',
            createdAt: timestamp,
            updatedAt: timestamp,
            ingredient: []
        })
        saveRecipes()
    
        return id
    }
    
    // Save the recipes to localStorage
    const saveRecipes = () => {
        localStorage.setItem('recipes', JSON.stringify(recipes))
    }
    
    // Remove a recipe from the list
    const removeRecipe = (id) => {
        const recipeIndex = recipes.findIndex((recipe) => recipe.id === id)
    
        if (recipeIndex > -1) {
            recipes.splice(recipeIndex, 1)
            saveRecipes()
        }
    }
    
    // Remove all recipes from the recipe array
    const cleanSlate = () => {
        recipes = []
        saveRecipes()
    }
    
    const updateRecipe = (id, updates) => {
        const recipe = recipes.find((recipe) => recipe.id === id)
    
        if (!recipe) {
            return
        }
    
        if (typeof updates.title === 'string') {
            recipe.title = updates.title
            recipe.updatedAt = moment().valueOf()
        }
    
        if (typeof updates.body === 'string') {
            recipe.body = updates.body
            recipe.updateAt = moment().valueOf()
        }
    
        saveRecipes()
        return recipe
    }
    
    const createIngredient = (id, text) => {
        const recipe = recipes.find((recipe) => recipe.id === id)
    
        const newItem = {
            text,
            have: false
        }
        recipe.ingredient.push(newItem)
        saveRecipes()
    }
    
    const removeIngredient = (id) => {
        const ingredient = recipes.find((recipe) => recipe.id === id)
        console.log(ingredient)
        const allIngredients = ingredient.todo.forEach((ingredient) => console.log(ingredient.text))
    
        // const recipeIndex = recipes.find((recipe) => recipe.id === id)
    
        // for (let text of recipeIndex) {
        //     console.log(recipdeIndex[text])
        // }
    
    // Attempt 3
        // if (indexOfIngredient === 0) {
        //     ingredientIndex.splice(index, 1)
        //     saveRecipes()
        // } else {
        //     console.log('error')
        // }
        // Attempt 2
        // const recipe = recipes.find((recipe) => recipe.id === id)
        // const ingredients = recipe.todo 
        // // let newItem = ingredients.forEach((item) => item)
    
        // if (ingredients.text === 'breadcrumbs') {
        //     ingredients.splice(ingredients, 1)
        //     saveRecipes()
        // }
        // Attempt 1
        // const ingredientName = ingredients.forEach((ingredient, index, array) => console.log(ingredient, index, array))
        // console.log(ingredientName)
    
        // const recipeIndex = recipes.findIndex((recipe) => recipe.id === id)
    
        // if (recipeIndex > -1) {
        //     recipes.splice(recipeIndex, 1)
        //     saveRecipes()
        // }
    }
    
    recipes = loadRecipes()
    

    产量

    {id: "ef88e013-9510-4b0e-927f-b9a8fc623450", title: "Spaghetti", body: "", createdAt: 1546878594784, updatedAt: 1546878608896, …}
    recipes.js:94 breadcrumbs
    recipes.js:94 noodles
    recipes.js:94 marinara
    recipes.js:94 meat
    recipes.js:94 ground beef
    recipes.js:94 milk
    

    所以我可以查看上面打印的输出并查看 ingredients 数组,但尝试根据 index 数字或 key 对于我来说,还不能使用我已经尝试过的函数,以及我在StackOverflow上找到的关于对象、数组和拼接方法的信息。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dacre Denny    6 年前

    如果我理解正确(在阅读了代码中注释掉的尝试之后),您将尝试从对应于 id 传递给 removeIngredient() 功能。

    在这种情况下,也许你可以采取一种稍微不同的方法从食谱中去除成分。 todo 数组,通过 Array#filter 方法?

    你可以使用 filter() 用以下方法“过滤”(即除去)面包屑 托多 通过以下筛选逻辑排列:

    // Keep any ingredients that do not match ingredient (ie if ingredient
    // equals "breadcrumbs")
    todo.filter(todoIngredient => todoIngredient !== ingredient) 
    

    你可以考虑修改你的 删除redient()。 功能;

    • 添加附加项 ingredient 函数参数的参数。这允许您指定要从对应的配方中删除的成分 recipeId

    • 并且,介绍 过滤器() 描述的想法:


    const removeIngredient = (recipeId, ingredient) => {
    
        const recipe = recipes.find(recipe => recipe.id === recipeId)
    
        if(recipe) {
    
            // Filter recipe.todo by ingredients that do not match  
            // ingredient argument, and reassign the filtered array 
            // back to the recipie object we're working with
            recipe.todo = recipe.todo.filter(todoIngredient => 
                                             (todoIngredient !== ingredient));
        }
    
    }
    

    现在,当您为每种配料引入“删除”按钮时,您将调用 删除redient()。 如下:

    var recipeId = /* got id from somewhere */
    var ingredientText = /* got ingredient from somewhere */
    
    removeIngredient( recipeId, ingredientText );
    

    希望这有帮助!