如何通过特定条件将对象添加到数组?

Suc*_*Man -2 javascript arrays jquery key object

我试着这样:

<script type="text/javascript">
    var clubs = [ 
        {id: 1, name : 'chelsea'},
        {id: 2, name : 'city'},
        {id: 3, name : 'liverpool'}
    ];
    var newClub = {id: 4, name: 'manchester united'}
    for(var i=0; i<clubs.length; i++) {
        if(clubs[i].id!=newClub.id) {
            clubs.push(newClub);
            break;
        }
    }
    console.log(clubs);
</script>
Run Code Online (Sandbox Code Playgroud)

我想添加条件.如果在俱乐部数组中不存在newClub对象的id,那么我想将该对象添加到数组中

有用

但我问.这是最好的方式吗?还是有另一种更好的方法吗?

T.J*_*der 6

有用

不,它没有.:-)如果第一个条目不匹配,你正在推动新俱乐部:

var clubs = [ 
    {id: 1, name : 'chelsea'},
    {id: 2, name : 'city'},
    {id: 3, name : 'liverpool'}
];
function pushClub(newClub) {
  for(var i=0; i<clubs.length; i++) {
      if(clubs[i].id!=newClub.id) {
          clubs.push(newClub);
          break;
      }
  }
}
var newClub = {id: 4, name: 'manchester united'}
pushClub(newClub);
pushClub(newClub);
console.log(JSON.stringify(clubs));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
  max-height: 100% !important;
}
Run Code Online (Sandbox Code Playgroud)
Note that there are two id = 4 clubs.
Run Code Online (Sandbox Code Playgroud)

在知道是否应添加新项目之前,需要遍历整个数组.

我可能会Array#some用来查看该项目是否存在:

if (!clubs.some(c => c.id == newClub.id)) {
    clubs.push(newClub);
}
Run Code Online (Sandbox Code Playgroud)

var clubs = [ 
    {id: 1, name : 'chelsea'},
    {id: 2, name : 'city'},
    {id: 3, name : 'liverpool'}
];
function pushClub(newClub) {
  if (!clubs.some(c => c.id == newClub.id)) {
    clubs.push(newClub);
  }
}
var newClub = {id: 4, name: 'manchester united'}
pushClub(newClub);
pushClub(newClub);
console.log(JSON.stringify(clubs));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
  max-height: 100% !important;
}
Run Code Online (Sandbox Code Playgroud)
Note that there is only one id = 4 club.
Run Code Online (Sandbox Code Playgroud)

我在那里使用ES2015 +箭头功能,但你可以使用ES5传统功能:

if (!clubs.some(function(c) { return c.id == newClub.id; })) {
    clubs.push(newClub);
}
Run Code Online (Sandbox Code Playgroud)

循环进入some,true如果回调返回一个真值,或者false它从未返回,则返回.(当回调返回真值时,它也会提前停止.)


如果您想更新现有俱乐部(如果有的话),我会Array#find改用:

var existingClub = clubs.find(c => c.id == newClub.id);
if (existingClub) {
    existingClub.name = newClub.name;
} else {
    clubs.push(newClub);
}
Run Code Online (Sandbox Code Playgroud)