替代find()操作对象

时间:2018-06-14 05:00:03

标签: javascript ecmascript-6

这是我的原始数据/参数:

const reference = ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"] // expected new reference value
const elementID = "XyLChbksZjenyEHqL" // ID of the array object which should be updated

const data = {
  getContent: {
    content: [
      { _id: "XyLChbksZjenyEHqL", reference: ['hp9v53uQqQPRXSYAi'] },
      // some more objects here
    ]
  }
}

现在我需要设置具有特定id的数组对象的引用值。

const result = {
  getContent: {
    content: [
      { _id: "XyLChbksZjenyEHqL", reference: ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"] },
      // some more objects here
    ]
  }
}

我是这样做的:

data.getContent.content
  .find(({ _id }) => _id === elementID).reference = reference

但由于IE11不支持find(),我问是否有另一种方法可以完成这项工作。 我不想在这个简单的事情上使用polyfill。

4 个答案:

答案 0 :(得分:1)

您可以使用forEach

data.getContent.content.forEach((element)=>{
    if (element.id === elementID){
         element.reference = reference;
    }
});

它以类似的方式工作。您将callback传递给forEach函数,并在数组的每个元素上执行该回调。

然后,检查当前正在处理的元素是否与id给出的elementID相同。

如果是,则将该特定元素的reference设置为您想要的任何内容。

答案 1 :(得分:0)

尝试以下方法:

您可以使用forEach循环,并将所有对象ID与元素id匹配,并更新元素id与对象id匹配的对象的引用。

  

请注意 -   IE9或更高版本支持forEach,如果您使用以前的版本,请使用简单的for循环。 Reference

const reference = ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"] ;
const elementID = "XyLChbksZjenyEHqL" ;

const data = {
  getContent: {
    content: [
      { _id: "XyLChbksZjenyEHqL", reference: ['hp9v53uQqQPRXSYAi'] },
      // some more objects here
    ]
  }
};
data.getContent.content.forEach(function(o){
  if(o._id === elementID){
      o.reference = reference;
   }
});

console.log(data);

答案 2 :(得分:0)

您可以使用简单的for loop

const reference = ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"];
let elementID = "XyLChbksZjenyEHqL";
const result = {
  getContent: {
    content: [
      { _id: "XyLChbksZjenyEHqL", reference: ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"] },
      // some more objects here
    ]
  }
}

let obj;
for (let i = 0; i < result.getContent.content.length; i++) {
  if(result.getContent.content[i]._id === elementID) {
    obj = result.getContent.content[i];
    break;
  }
}
if(obj) obj.reference= reference;
console.log(result)

您还可以在循环中更新对象

const reference = ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"];
let elementID = "XyLChbksZjenyEHqL";
const result = {
  getContent: {
    content: [
      { _id: "XyLChbksZjenyEHqL", reference: ["gYDJWsfSHFBzoGjya", "hp9v53uQqQPRXSYAi"] },
   ]
  }
};

for (let i = 0; i < result.getContent.content.length; i++) {
  if(result.getContent.content[i]._id === elementID) {
    result.getContent.content[i].reference = reference;
    break;
  }
}
console.log(result)

或者您可以为MDN

上的Array.find创建一个Polyfill

答案 3 :(得分:0)

以下find() function returns来自array的给定predicate的第一场比赛。

有关详细信息,请参阅forreturn

JS transpiler// Input. const input = [{id:1}, {id:2}, {id:3}, {id:4}, {id:5, y:'five'}] // Find. function find(array, predicate) { for (var i = 0; i < array.length; i ++) { var x = array[i]; if (predicate(x)) { return x; } } return false; } // Proof. console.log(find(input, x => x.id === 5)) // {id: 5, y: 'five'} console.log(find(input, x => x.id === 10)) // false也可能值得调查。

var noLeadingSpace = /^\w.*$/;

$("input")
  .data("oldValue", "")
  .bind("input propertychange", function() {
    var $this = $(this);
    var newValue = $this.val();

    if (!noLeadingSpace.test(newValue))
        return $this.val($this.data("oldValue"));

    return $this.data("oldValue", newValue);
  });