Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中用对象数组中的重复属性标记第一个对象_Javascript_Arrays_Json - Fatal编程技术网

如何在JavaScript中用对象数组中的重复属性标记第一个对象

如何在JavaScript中用对象数组中的重复属性标记第一个对象,javascript,arrays,json,Javascript,Arrays,Json,我有这样一个数组: var myArray = [ {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com'}, {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com'}, {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com'}, {id: 4, entry_id: 2, name: 'test'

我有这样一个数组:

 var myArray = [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com'},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com'},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com'},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com'},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com'},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com'},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com'},
 ];
 [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com', isFirst:true},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
 ];
function updateArray() {
    var foundFirst = false;
    myArray.forEach((item, i) => {
      item.isFirst = false;
      myArray.forEach((item2, j) =>{
        if (!foundFirst && item.entry_id == item2.entry_id && item.name == item2.name && i < j ) {
          item.isFirst = true;
          foundFirst = true;
        } else {
          item.isFirst = false;
      }
   })
 })
 return myArray;
}
我需要用相等的'entry_id'和'name'标记哪个元素是第一个元素,所以结果应该如下所示:

 var myArray = [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com'},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com'},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com'},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com'},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com'},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com'},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com'},
 ];
 [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com', isFirst:true},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
 ];
function updateArray() {
    var foundFirst = false;
    myArray.forEach((item, i) => {
      item.isFirst = false;
      myArray.forEach((item2, j) =>{
        if (!foundFirst && item.entry_id == item2.entry_id && item.name == item2.name && i < j ) {
          item.isFirst = true;
          foundFirst = true;
        } else {
          item.isFirst = false;
      }
   })
 })
 return myArray;
}
我已经尝试过的:

function updateArray() {
    myArray.forEach((item, i) => {
      item.isFirst = false;
      myArray.forEach((item2, j) =>{
        if (item.entry_id == item2.entry_id && item.name == item2.name && i < j ) {
          item.isFirst = true;
        } else if (!item.isFirst) {
          item.isFirst = false;
      }
   })
 })
 return myArray;
}
有没有比使用两个循环更好的方法

谢谢你的帮助

链接到JSFIDLE:

找到并设置第一个匹配项后,只需返回
myArray
。或者您可以返回找到它的数组索引并使用它

如果需要在每个对象上设置
isFirst
属性(因为该属性在该对象中不存在),并且希望在循环中完成此操作,则只需将代码更改为如下内容:

 var myArray = [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com'},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com'},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com'},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com'},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com'},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com'},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com'},
 ];
 [
    {id: 1, entry_id: 1, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 2, entry_id: 1, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 3, entry_id: 2, name: 'test', email: 'foo@bar.com', isFirst:true},
    {id: 4, entry_id: 2, name: 'test', email: 'bar@foo.com', isFirst:false},
    {id: 5, entry_id: 3, name: 'test', email: 'joe@ocean.com', isFirst:true},
    {id: 6, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
    {id: 7, entry_id: 3, name: 'test', email: 'foo@bar.com', isFirst:false},
 ];
function updateArray() {
    var foundFirst = false;
    myArray.forEach((item, i) => {
      item.isFirst = false;
      myArray.forEach((item2, j) =>{
        if (!foundFirst && item.entry_id == item2.entry_id && item.name == item2.name && i < j ) {
          item.isFirst = true;
          foundFirst = true;
        } else {
          item.isFirst = false;
      }
   })
 })
 return myArray;
}
函数updateArray(){
var foundFirst=false;
myArray.forEach((项目,i)=>{
item.isFirst=false;
myArray.forEach((item2,j)=>{
如果(!foundFirst&&item.entry\u id==item2.entry\u id&&item.name==item2.name&&i
尝试将函数更新为类似的内容。。免责声明。。这确实假设您的json将被订购

const myArray=[
{id:1,条目_id:1,名称:'test',电子邮件:'foo@bar.com'},
{id:2,条目_id:1,名称:'test',电子邮件:'bar@foo.com'},
{id:3,条目_id:2,名称:'test',电子邮件:'foo@bar.com'},
{id:4,条目_id:2,名称:'test',电子邮件:'bar@foo.com'},
{id:5,条目\ id:3,姓名:'Joe Ocean',电子邮件:'joe@ocean.com'},
{id:6,条目\ id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com'},
{id:7,条目\ id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com'},
];
函数updateArray(){
var-previitem=“”;
myArray.forEach((项目,i)=>{
item.isFirst=item.entry\u id!=previitem;
PreviItem=item.entry\u id;
});
返回myArray;
}
log(updateArray())可以与助手对象一起使用来迭代数组。对于数组中存在的每个元素,将
isFirst
设置为
false
。如果某个元素不在
helper
对象中,请将其添加到helper中,并将
isFirst
设置为
true

使用或克隆原始对象,然后添加
isFirst

const myArray=[
{id:1,条目_id:1,名称:'test',电子邮件:'foo@bar.com'},
{id:2,条目_id:1,名称:'test',电子邮件:'bar@foo.com'},
{id:3,条目_id:2,名称:'test',电子邮件:'foo@bar.com'},
{id:4,条目_id:2,名称:'test',电子邮件:'bar@foo.com'},
{id:5,条目\ id:3,姓名:'Joe Ocean',电子邮件:'joe@ocean.com'},
{id:6,条目\ id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com'},
{id:7,条目\ id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com'},
];
const helper=Object.create(null);
const result=myArray.map(函数(o){
const key=`${o.entry_id}-${o.name}`;
const isFirst=helper[key]?false:(helper[key]=true);
返回{…o,isFirst};
});

控制台日志(结果)此方法使用名为
已访问的对象来跟踪已检查的元素

此示例有两个名为“Jenny Block”的对象

var myArray=[{id:1,条目_id:1,名称:'test',电子邮件:'foo@bar.com'},{id:2,条目_id:1,名称:'test',电子邮件:'bar@foo.com'},{id:3,条目_id:2,名称:'test',电子邮件:'foo@bar.com'},{id:4,条目_id:2,名称:'test',电子邮件:'bar@foo.com{id:5,条目id:3,姓名:'Joe Ocean',电子邮件:'joe@ocean.com'},    {id:6,条目\ id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com“},{id:7,条目_id:3,姓名:'Jenny Block',电子邮件:'foo@bar.com'}, ],
访问={};
myArray.forEach(c=>{
var key=`${c.entry_id}${c.name}`;
c、 isFirst=!已访问[key];
已访问[键]=真
});
console.log(myArray);

。作为控制台包装{max height:100%!important;top:0;}
您可以使用哈希表在单个循环中收集所需组的第一个标志

var数组=[{id:1,条目_id:1,名称:'test',电子邮件:'foo@bar.com'},{id:2,条目_id:1,名称:'test',电子邮件:'bar@foo.com'},{id:3,条目_id:2,名称:'test',电子邮件:'foo@bar.com'},{id:4,条目_id:2,名称:'test',电子邮件:'bar@foo.com'},{id:5,条目_id:3,名称:'test',电子邮件:'joe@ocean.com' }, {id:6,条目_id:3,名称:'test',电子邮件:'foo@bar.com“},{id:7,条目_id:3,名称:'test',电子邮件:'foo@bar.com' }],
keys=['entry_id','name'],
hash=Object.create(null);
array.forEach(o=>{
var key=keys.map(k=>o[k]).join(“|”);
o、 isFirst=!散列[key];
哈希[键]=真;
});
console.log(数组);
。作为控制台包装{最大高度:100%!重要;顶部:0;}