【问题标题】:javascript find object in array by value and append additional valuejavascript 按值在数组中查找对象并附加附加值
【发布时间】:2012-10-18 02:49:14
【问题描述】:

我认为标题解释得很好。我有一个数组,每个对象有两个值,我需要通过其中一个值查找对象,然后为其分配第三个值。

这是胆量:

$slides.push({
    img: el.attr('href'),
    desc: el.attr('title').split('Photo #')[1]
});

这样构建一个数组:

Object
    desc: 127
    img: img/aaron1.jpg
Object
    desc: 128
    img: img/aaron2.jpg

我想查找desc 的值,然后分配第三个值in: yes

$slides.findInArray('desc', '127').addValueToObject('in','yes')

【问题讨论】:

  • 名称中的 $ 是什么?基本上你需要循环和比较。
  • 它是一个全局变量;不过名字并不重要。循环和比较?
  • 循环...又名 for 循环。查看数组的每个索引。比较又名 x==y,检查每个对象的属性的值?似乎是一个简单的解决方案。美元符号没有意义,听起来你想让 JavaScript 感觉像是另一种语言。
  • 如果是 jquery 对象,我通常会在变量的开头添加一个美元符号,以提醒自己它是简写,例如$this = $(this)。否则,是的。看起来你正试图让它看起来像一种不同的语言。
  • 哦,对了。这是一个很好的观点。

标签: javascript arrays object find push


【解决方案1】:

http://jsfiddle.net/S3cpa/

var test = [
    {
        desc: 127,
        img: 'img/aaron1.jpg',
    },
    {
        desc: 128,
        img: 'img/aaron2.jpg',
    }
];

function getObjWhenPropertyEquals(prop, val)
{
    for (var i = 0, l = test.length; i < l; i++) {
        // check the obj has the property before comparing it
        if (typeof test[i][prop] === 'undefined') continue;

        // if the obj property equals our test value, return the obj
        if (test[i][prop] === val) return test[i];
    }

    // didn't find an object with the property
    return false;
}

// look up the obj and save it
var obj = getObjWhenPropertyEquals('desc', 127);

// set the new property if obj was found
obj.in = obj && 'yes';

【讨论】:

    【解决方案2】:
    easy way
    
    
    
     for (var i = 0; i < $slides.length; i++) 
        {
            if ($slides[i]["desc"] == "TEST_VALUE")
            {
                $slides[i]['in']='yes';
            }
        }
    

    Another way
    
        Array.prototype.findInArray =function(propName,value)
        {
            var res={};
            if(propName && value)
            {
              for (var i=0; i<this.length; i++)
              {
                if(this[i][propName]==value)
                {
                   res = this[i];
                   break;
                }
              }
            }
            return res;
        }
    
    
        Object.prototype.addValueToObject =function(prop,value)
       {
            this[prop]=value;
       }
    

    ---使用它--

    $slides.findInArray('desc', '127').addValueToObject('in','yes');
    

    http://jsfiddle.net/s6ThK/

    【讨论】:

    • 当你找到正确的对象时,你应该从循环中中断以避免浪费循环循环。
    • 用户复制了我的代码,包括其中的错误,然后得到正确答案?
    • @MattStone 很好,我明白为什么你的答案更好。将调整我的接受度。
    • @Jan 没有看到或注意到您的任何一个错误。当您先回答时,他通过添加“in:yes”来更完整地回答
    • 检查最后一个右括号.. :)
    【解决方案3】:

    你需要通过for循环来运行它

    // Loop through the array
    for (var i = 0 ; i < $slides.length ; i++) 
    {
        // Compare current item to the value you're looking for
        if ($slides[i]["desc"] == myValue)
        {
            //do what you gotta do
            $slides[i]["desc"] = newValue;
            break;
        }
    }
    

    【讨论】:

    • continue 只会跳转到下一个循环迭代。您需要使用休息时间;退出循环的语句。
    【解决方案4】:

    使用现代 JS 可以简单地完成:

    var obj = $slides.find(e => e.desc === '127');
    if (obj) {
        obj.in = 'yes';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2022-01-04
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多