Javascript

时间:2017-07-29 12:28:45

标签: javascript

我有一些像objets这样的对象:

var MyArray = [] ,
    Person = {}, 

[
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
]

我想查看,如果我的数据有姓名' John'不添加新人的,如果没有,则添加姓名为' John'等等。

提前致谢。

8 个答案:

答案 0 :(得分:3)

您可以使用Array#find处理它。我假设您要改变原始数组。

let arr = [{
    name: 'Jesica',
    surname: 'Garou',
    age: '31'
  },
  {
    name: 'Max',
    surname: 'Jolie',
    age: '50'
  }
];

const obj = {
  name: 'John',
  surname: 'Smith',
  age: '22'
};

const ensure = ({ name, ...z }) => {
  if (!arr.find(v => v.name === name)) {
    arr.push({ name, ...z });
  }
}

ensure(obj);

console.log(arr);

答案 1 :(得分:3)

你可以使用map,但你必须知道map迭代遍历数组中的所有元素,而findIndex返回第一个元素索引,它等于条件并停止循环。

var MyArray = [
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
];

if(MyArray.findIndex(index => index.name === "John") > -1)
  console.log("Found!");
else
    console.log("Not found!");

答案 2 :(得分:2)

要检查数组中是否已存在name,您可以使用array.some函数。它会检查提供的name是否已经退出。

如果没有,那么你可以编写代码来推送数组中的对象。

我使用了样本名称JohnAnne。对于John,函数isAlreadyPresent返回true。对于Anne,它会返回false

let arr = [
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
];

function isAlreadyPresent(name) {
  return arr.some(a => a.name === name );
}

console.log('John already exists?',isAlreadyPresent('John'));
console.log('Anne already exists?',isAlreadyPresent('Anne'));

答案 3 :(得分:0)

您需要遍历所有对象并检查其每个名称值。最糟糕的是在O(n)时间运行。

例如,要检查" John"是数组中的名称:

var inArray = false; // Have we found the name in the array yet?
for (var i = 0; i < MyArray.length; i++) { // Loop through the array of objects
    if (MyArray[i].name=="John") { // If the name field is equal to "John"
        inArray = true; // Name is in the array
        break; // Exit the loop
    }
}

答案 4 :(得分:0)

也许名称地图可能有用:

var byNam e =new Map(myArray.map(el=>[el.name,el]));

所以你可以很容易地做到:

if (byName.has("John")){
  alert("already exists");
} else {
  var obj = { name: "John" };
  Map.set(obj.name,obj);
  myArray.push(obj);
}

可以使用Set也可以实现上限,但您可能还想这样做:

byName.get("John").age=15;

答案 5 :(得分:0)

var searchTerm = "John",
index = -1;
for(var i = 0, len = MyArray.length; i < len; i++) {
    if (MyArray[i].name === searchTerm) {
        alert("matched string");
        index = i;
        break;
    }
}

答案 6 :(得分:-1)

你可以制作这样的搜索功能:

const index = (array, name) => {
  // Search for the string "name" in your array
  for (let i in array){
    // Look at every element in the array, if an element has the
    // corresponding name, return its index
    if (array[i].name === name) return i;
  }
  return -1;
  // If you found nothing, return -1
}

let position = index(myArray, "John");

答案 7 :(得分:-2)

传统上我们使用构造函数来构建许多类似的对象。但是,这是怎么回事,并且超出了你所要求的范围。

这里我们可以使用for ... in循环迭代MyArray,并检查每个对象是否包含名称John。

load() {

if (this.data) {

  return Promise.resolve(this.data);
}

return new Promise(resolve => {

  this.http.get('http://localhost/retrieve-data.php')
  .map(res => res.json())
  .subscribe(data => {

    this.data = this.applyHaversine(data);
    this.data.sort((locationA, locationB) => {
      return locationA.distance - locationB.distance;
    });

    resolve(this.data);
  });

});