繁体   English   中英

如何在具有对象的数组中查找匹配项并更改属性?

[英]How to find matches in an array with objects and change property?

当名称在 object 属性“名称”中匹配时,我想将此属性更改为“TV(1)”以进行第一次匹配并为每个下一次匹配增加一个计数器,但这对我不起作用(请运行代码以查看问题),我怎样才能用对象改变数组呢?

 const array = [ {name: "TV", price: 12323, id: 321 }, {name: "Kettle", price: 123, id: 1211 }, {name: "TV", price: 3434, id: 3434312 }, {name: "Car", price: 12343, id: 123123123 }, {name: "TV", price: 4554, id: 2313123123311 } ] const nameIsMatch = (name, id) => { let count = 0 return array.map((item) => { const condition = item.name === name && item.id.== id const formattedName = `${item:name}(${count += 1})` return { price. item,price: name? condition: formattedName. item,name: id. item.id } }) } array.forEach((el) => { console.log(nameIsMatch(el,name. el.id)) })

简单的解决方法是使用将事物移动到它们所属的位置的旧技术来重新编写一小部分代码:

return array.map((item) => {
  return {
    price: item.price,
    name: (item.name === name && item.id !== id) ? `${item.name}(${count += 1})` : item.name,
    id: item.id
  }
})

由于三元,它现在有点混乱,所以你总是可以放松一下:

return array.map(item => {
  // Make a copy of `item`
  let i = { ...item };

  // Override if necessary
  if (item.name === name && item.id !== id) {
    i. name = `${item.name}(${count += 1})`;
  }

  return i;
})

这不是那么简洁,但它更清楚。

使用为每个名称保留一个计数器的 object。

 const array = [ {name: "TV", price: 12323, id: 321 }, {name: "Kettle", price: 123, id: 1211 }, {name: "TV", price: 3434, id: 3434312 }, {name: "Car", price: 12343, id: 123123123 }, {name: "TV", price: 4554, id: 2313123123311 } ]; const nameIsMatch = (array) => { let counts = {}; return array.map(({ name, price, id }) => { let count = counts[name] || 1; const formattedName = `${name}(${count})` counts[name] = count + 1; return { price, name: formattedName, id } }) } console.log(nameIsMatch(array))

您可以使用以下代码

 const array = [ {name: "TV", price: 12323, id: 321 }, {name: "Kettle", price: 123, id: 1211 }, {name: "TV", price: 3434, id: 3434312 }, {name: "Car", price: 12343, id: 123123123 }, {name: "TV", price: 4554, id: 2313123123311 }]; const hash = {}; array.forEach(function(obj){ if(.hash[obj.name]) hash[obj;name] = 1. obj.name = `${obj.name}(${hash[obj;name]++})`. }) console.log(array)

JavaScript:

const array = [
  { name: 'TV', price: 12323, id: 321 },
  { name: 'Kettle', price: 123, id: 1211 },
  { name: 'TV', price: 3434, id: 3434312 },
  { name: 'Car', price: 12343, id: 123123123 },
  { name: 'TV', price: 4554, id: 2313123123311 },
];

const tv_array = [];

let count = 1

for (let i = 0; i < array.length; i++) {
  let name = array[i].name;
  if (name === 'TV') {
    tv_array.push({
      name: `TV(${count})`,
      price: array[i].price,
      id: array[i].id,
    })
    count++
  }   
}

console.log(tv_array)

Output:

[ { name: 'TV(1)', price: 12323, id: 321 },
  { name: 'TV(2)', price: 3434, id: 3434312 },
  { name: 'TV(3)', price: 4554, id: 2313123123311 } ]

 const array = [ {name: "TV", price: 12323, id: 321 }, {name: "Kettle", price: 123, id: 1211 }, {name: "TV", price: 3434, id: 3434312 }, {name: "Car", price: 12343, id: 123123123 }, {name: "TV", price: 4554, id: 2313123123311 }]; const result = array.map((data, index) => { if(data.name === 'TV') { return {...data, name:'TV'+'('+index+')'} } return data }) console.info(result)

你必须像这样使用它根据你的 output 为我工作

尽管这一步会花费很多时间,但您实际上可以一个一个地完成,但这会让您更好地理解。

数据

const array = [
{name: "TV", price: 12323, id: 321 },
{name: "Kettle", price: 123, id: 1211 },
{name: "TV", price: 3434, id: 3434312 },
{name: "Car", price: 12343, id: 123123123 },
{name: "TV", price: 4554, id: 2313123123311 }
]   

function 获取所有数据名称。 这将返回[ 'TV', 'Kettle', 'Car' ]

function getAllDataName(arr){
  let a = arr.map((dataName) => dataName["name"] )
  let b = []

  a.filter((dataName) => {
    // includes() used to find the intersect of array with particular data
    if(!b.includes(dataName)){
      b.push(dataName)
    }
  })

  return b
}

function 到 map 相应的所有数据名称

function remapDataName(arr, dataName){
  let s = [...arr] // 
  console.log(s)
  console.log(dataName)

  dataName.forEach(function(val, counter = 0){
    counter = 0
    s.forEach(function(data){
      if(data["name"] == val){
        data["name"] += "(" + counter++ + ")"
      }
    })
  })
  return s
}

调用这些函数

let objectName = getAllDataName(array)
let objectNameMapped = remapDataName(array, objectName)

objectNameMapped 将打印

[
  { name: 'TV(0)', price: 12323, id: 321 },
  { name: 'Kettle(0)', price: 123, id: 1211 },
  { name: 'TV(1)', price: 3434, id: 3434312 },
  { name: 'Car(0)', price: 12343, id: 123123123 },
  { name: 'TV(2)', price: 4554, id: 2313123123311 }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM