【问题标题】:Delete JS object (row) from another object given the first从给定第一个对象的另一个对象中删除 JS 对象(行)
【发布时间】:2013-12-05 03:01:03
【问题描述】:

在 JavaScript 中,如何从包含它的另一个对象中删除一个对象或行?

var apple = { 'color': 'red', 'price': 100, 'origin': 'Japan' };
var fruits = { Object, Object, Object }; // objects: apple, orange, mango
delete fruits[apple]; // this does not work

'delete fruits[apple]' 或this SO thread 中解释的其他形式不起作用。

是否可以通过仅提供“object1”作为参数来从“object2”中删除“object1”,如前所述?

Deleting a row from javascript object中指出的方法:

var newFruits = fruits.filter(function( apple ) {
  return fruits.color != apple.color &&
      fruits.price != apple.price && 
      fruits.origin != apple.origin;
});

也不行。

编辑

fruits 只包含{ 'color', 'price' , 'origin' } 的行,因此是最后一种方法。我实际上需要比较可能位于 fruits 数组中的新数组中的这三个组件。

【问题讨论】:

  • fruits 是一个数组吗?仅供参考,您错误地实施了另一个问题中提出的方法。如果fruits 是您的数组,那么它将没有属性color
  • 变量 fruits 是数组还是对象?因为如果你想删除变量,你需要一些 id 或 name 来关联。
  • 例如 fruits 是 object 但 key 是 fruits = {'apple':{values}}。好的,你只需要 put delete fruits['apple']
  • 大家好。我更新了问题。 @GuilhermeSoares,不幸的是,在我的情况下,我没有一个键,而是唯一的键组合。
  • @thekalaban 请查看我的回复,希望对您有所帮助。

标签: javascript javascript-objects


【解决方案1】:

另一个问题中方法的正确应用是:

var apple = { 'color': 'red', 'price': 100, 'origin': 'Japan' };
var newFruits = fruits.filter(function( obj ) {
  return obj.color != apple.color &&
      obj.price != apple.price && 
      obj.origin != apple.origin;
});

您尝试访问fruits.color,它总是返回undefined,因为数组没有color 属性。相反,您必须将 数组的每个元素 的属性与您的参考对象进行比较。我建议查看MDN documentation 以了解.filter 的工作原理(它期望哪些参数,哪些参数被传递给回调等)。

【讨论】:

  • 谢谢。我将如何使这个动态?就像我如何传递一个可以替换 apple 的新变量一样?
  • 创建一个接受数组和引用对象的函数,并将代码放入该函数中。
【解决方案2】:

如何解决这个错误:

首先你需要一些键来获取值:

型号

例如,如果你工作,如果水果:

var fruits = 
{
    "apple": { 
        'color': 'red', 
        'price': 100, 
        'origin': 'Japan' 
    }

    //other fruits
}

如何从可变水果中删除一些水果

很简单,只需要下面这段代码:

delete fruits['apple'];

方法过滤

我不明白你为什么用它来尝试删除。

var newFruits = fruits.filter(function( apple ) {
  return fruits.color != apple.color &&
      fruits.price != apple.price && 
      fruits.origin != apple.origin;
});

我创建类来操作水果的重构

var Fruits = function(){
    this.values = {
        "apple": { 
            'color': 'red', 
            'price': 100, 
            'origin': 'Japan' 
        }
    }

    this.filter = function(obj){
        var f = {}; //list of fruits

        //Loop in all fruits
        for(var name in this.values){

            var fruit = this.values[name];
            var validFruit = true;

            //Check the obj values..
            for(prop_name in obj){

                var prop_value = obj[prop_name];

                if((typeof fruit[prop_name] === "undefined") || (fruit[prop_name] !== prop_value)){
                    validFruit = false; //Is not valid
                }
            }

            if(validFruit === true){
                f[name] = fruit;
            }
        }

        return f;
    };

    this.deleteIfHas = function(obj){
        var list = this.filter(obj);
        for(var key in list){
            delete this.values[key];
        }
    }

    this.setFruit = function(name, info){
        this.values[name] = info;
    }

    this.getFruit = function(name){
        return (typeof this.values[name] !== "undefined") ? this.values[name] : false;
    }
}

测试..

var classFruit = new Fruits();
console.log(classFruit.filter({"origin":"Japan"})); // {"apple":{values of apple}}
classFruit.deleteIfHas({"origin":"Japan"}); //Delete apple
console.log(classFruit.values); //return {} because i delete apple

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2021-03-15
    • 1970-01-01
    • 2018-07-08
    • 2021-07-11
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多