วิธีการตรวจสอบว่าอาร์เรย์ Javascript มีวัตถุที่มีคุณลักษณะที่เท่ากับค่าที่กำหนดหรือไม่?


658

ฉันมีอาร์เรย์เหมือน

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    } //and so on goes array... 
];

ฉันจะตรวจสอบอาร์เรย์นี้เพื่อดูว่ามี Magenic อยู่ได้อย่างไร ฉันไม่ต้องการวนซ้ำเว้นแต่ฉันจะต้องทำ ฉันกำลังทำงานกับอาจบันทึกสองสามพัน


ปรับปรุง

เนื่องจากนี่เป็นโพสต์ยอดนิยมฉันคิดว่าฉันจะแบ่งปันสิ่งใหม่ที่ฉันพบ และดูเหมือนว่า @CAFxX ได้แชร์สิ่งนี้แล้ว! ฉันควรอ่านบ่อยขึ้น ฉันมาข้ามhttps://benfrain.com/understanding-native-javascript-array-methods/

vendors.filter(function(vendor){ return vendor.Name === "Magenic" })

และด้วยECMAScript 2015มันง่ายยิ่งขึ้นเมื่อใช้ฟังก์ชั่นลูกศรใหม่:

vendors.filter(vendor => vendor.Name === "Magenic")

โปรดให้อภัยความคิดเห็นที่สุ่มดูเหมือน แต่คำถามของคุณเกี่ยวข้องกับ JSON หรือเพียงแค่อาร์เรย์ JavaScript?
Alex Turpin

4
@CAFxX โซลูชันดีกว่าจะดีมากถ้าคุณอัปเดตโซลูชันที่เลือก
eMarine

1
เห็นด้วยไม่เห็นว่าก่อนหน้านี้!
David Lozzi

คุณสามารถทำให้สิ่งนี้ง่ายขึ้นยิ่งขึ้นโดยใช้ฟังก์ชั่นลูกศร เบราว์เซอร์ที่ทันสมัยทั้งหมดรองรับสิ่งนี้และดูดีกว่า
Piotr Kula

คุณสามารถใช้ฟังก์ชั่นแผนที่ใช้งานได้ดีมาก
Monir alhussini

คำตอบ:


264

2018 แก้ไข : คำตอบนี้มาจาก 2011 ก่อนที่เบราว์เซอร์จะรองรับวิธีการกรองอาร์เรย์และฟังก์ชั่นลูกศรอย่างกว้างขวาง มีลักษณะที่คำตอบของ CAFxX

ไม่มีวิธี "วิเศษ" ในการตรวจสอบบางอย่างในอาร์เรย์โดยไม่มีการวนซ้ำ แม้ว่าคุณจะใช้ฟังก์ชั่นบางฟังก์ชั่นนั้นจะใช้การวนซ้ำ สิ่งที่คุณสามารถทำได้คือแยกออกจากลูปทันทีที่คุณพบสิ่งที่คุณกำลังมองหาเพื่อลดเวลาในการคำนวณ

var found = false;
for(var i = 0; i < vendors.length; i++) {
    if (vendors[i].Name == 'Magenic') {
        found = true;
        break;
    }
}

4
ไม่มีปัญหา. โปรดทราบว่าโซลูชันของ Keithนั้นสามารถใช้งานได้จริงและช่วยคุณไม่ให้วนลูป
Alex Turpin

2
คุณไม่จำเป็นต้องตั้งค่าสถานะหากสิ่งที่คุณต้องรู้คือว่า "บางสิ่ง" อยู่ในนั้นหรือไม่คุณสามารถตรวจสอบค่าดัชนีการสแกนด้วยขนาดของอาร์เรย์ เพื่อให้สามารถใช้งานได้ต้องมีการประกาศ var index ก่อนสำหรับคำสั่ง for course
อเล็กซ์

5
ตัวเลือกเหล่านี้ดูเหมือนจะใช้งานได้แล้วตอนนี้: ผู้ขาย forEach, ผู้ขายตัวกรอง, ผู้ขายลด
เดวิด Lozzi

1
JSON.stringify (ผู้ขาย) .indexOf ('Magenic')! == -1
ลมหายใจสุดท้าย

1
@ LastBreath ที่อาจส่งผลในเชิงบวกที่ผิดพลาดได้ง่าย ๆ หาก'Magenic'อยู่ในที่อื่นในวัตถุ
Alex Turpin

947

ไม่จำเป็นต้องบูรณาการ ล้อห่วงอย่างน้อยไม่ชัดเจน (โดยใช้ฟังก์ชั่นลูกศร , เบราว์เซอร์ที่ทันสมัยเท่านั้น ):

if (vendors.filter(e => e.Name === 'Magenic').length > 0) {
  /* vendors contains the element we're looking for */
}

หรือยังดีกว่า :

if (vendors.some(e => e.Name === 'Magenic')) {
  /* vendors contains the element we're looking for */
}

แก้ไข: หากคุณต้องการความเข้ากันได้กับเบราว์เซอร์หมัดแล้วทางออกที่ดีที่สุดของคุณคือ:

if (vendors.filter(function(e) { return e.Name === 'Magenic'; }).length > 0) {
  /* vendors contains the element we're looking for */
}

4
@Rocket ทำไมคุณถึงแก้ไขคำตอบของฉัน ไวยากรณ์โดยไม่ต้องวงเล็บปีกกาเป็นจาวาสคริปต์ที่ถูกต้องสมบูรณ์
CAFxX

4
ไวยากรณ์ "แลมบ์ดา" ยังคงไม่ทำงานใน Chrome 16 (ซึ่งไม่ใช่เบราว์เซอร์ที่มีหมัด)
Rocket Hazmat

27
ขึ้นอยู่กับคำจำกัดความของคุณของหมัดฉันเดา ไวยากรณ์นั้นเป็นส่วนหนึ่งของ javascript 1.8
CAFxX

7
ปิดการแสดงออกของคุณกำลังใช้ที่นี่ในตัวอย่างแรกและครั้งที่สองมีที่ไม่ได้มาตรฐานไม่ได้ใช้! คำเตือนจาก Mozilla (ดูลิงค์นั้น) พวกเขาเท่านั้นที่เคยทำงานใน Firefox และจะเลิกในขณะนี้และจะถูกลบออกในความโปรดปรานของฟังก์ชั่นลูกศร
doppelgreener

2
@ 7hibault เพราะsomeวงจรสั้นครั้งเดียวกับวัตถุname === "Magenic"ที่พบ ด้วยfilterมันจะตรวจสอบแต่ละรายการจนถึงจุดสิ้นสุดของอาร์เรย์และสร้างรายการอาร์เรย์ใหม่ที่ตรงกับเงื่อนไขจากนั้นตรวจสอบlength
adiga

93

ไม่จำเป็นต้องวนซ้ำ สามวิธีที่อยู่ในใจ:

Array.prototype.some ()

นี่คือคำตอบที่ตรงกับคำถามของคุณมากที่สุดนั่นคือ "ตรวจสอบว่ามีบางสิ่งอยู่หรือไม่" ซึ่งแสดงถึงผลการบูล สิ่งนี้จะเป็นจริงถ้ามีวัตถุ 'Magenic' ไม่เช่นนั้นจะเป็นเท็จ:

let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' )

Array.prototype.filter ()

สิ่งนี้จะส่งคืนอาร์เรย์ของวัตถุ 'Magenic' ทั้งหมดแม้ว่าจะมีเพียงหนึ่ง (จะส่งคืนอาร์เรย์แบบองค์ประกอบเดียว):

let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' )

หากคุณพยายามบีบบังคับสิ่งนี้กับบูลีนมันจะไม่ทำงานเนื่องจากอาร์เรย์ว่างเปล่า (ไม่มีวัตถุ 'Magenic') ยังคงเป็นจริง ดังนั้นเพียงใช้magenicVendors.lengthในเงื่อนไขของคุณ

Array.prototype.find ()

สิ่งนี้จะคืนค่าวัตถุ 'Magenic' แรก (หรือundefinedหากไม่มี):

let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' );

coerces นี้เป็นบูลีนโอเค (วัตถุใด ๆ ที่เป็นความจริงundefinedเป็นเท็จ)


หมายเหตุ: ฉันกำลังใช้ผู้ขาย ["ชื่อ"] แทนที่จะเป็นผู้ขายชื่อเนื่องจากการใส่ชื่อทรัพย์สินแปลก ๆ

หมายเหตุ 2: ไม่มีเหตุผลที่จะใช้ความเท่าเทียมกันแบบหลวม (==) แทนความเท่าเทียมที่เข้มงวด (===) เมื่อทำการตรวจสอบชื่อ


5
มันมีประโยชน์ที่จะชี้ให้เห็นว่าภายใต้ประทุนเหล่านี้ล้วน แต่วนรอบ สิ่งเหล่านี้ยังคำนวณได้ช้ากว่าการวนซ้ำและการดำเนินการ
ThePartyTurtle

อาจแชร์ความรักที่นี่ได้ด้วย: stackoverflow.com/questions/21748670/…ดังนั้นผู้คนอย่างฉันไม่ได้ไปที่หน้าเก่านั้นและตั้งสมมติฐาน
ThePartyTurtle

43

คำตอบที่ได้รับการยอมรับยังคงใช้งานได้ แต่ตอนนี้เรามีวิธีดั้งเดิมของ ECMAScript 6 [Array.find][1]เพื่อให้ได้ผลเช่นเดียวกัน

การอ้างอิง MDN:

find () วิธีการคืนค่าขององค์ประกอบแรกในอาร์เรย์ที่ตรงกับฟังก์ชั่นการทดสอบที่ให้ไว้ มิฉะนั้นจะถูกส่งคืนไม่ได้กำหนด

var arr = []; 
var item = {
  id: '21',
  step: 'step2',
  label: 'Banana',
  price: '19$'
};

arr.push(item);
/* note : data is the actual object that matched search criteria 
  or undefined if nothing matched */
var data = arr.find( function( ele ) { 
    return ele.id === '21';
} );

if( data ) {
 console.log( 'found' );
 console.log(data); // This is entire object i.e. `item` not boolean
}

ดูลิงก์ jsfiddleของฉันมีโพลีฟิลสำหรับ IE จัดทำโดย mozilla


2
อาจสั้นกว่านี้หากคุณทำreturn ele.id == '2'แต่ +1 สำหรับโซลูชัน ES6 ที่ดี
Lye Fish

ที่ดีที่จะมีคำตอบสด :) เพียงแค่สงสัยว่าประสิทธิภาพการทำงานจะดีกว่าหรือไม่คำตอบข้างต้น ...
Emidomenge

ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องชี้ให้เห็นว่าค่าส่งคืนของ 'data' (เมื่อ ele.id ตรงกับ id เช่น '21') จะเป็นไอเท็มอาร์เรย์เอง (ในกรณีนี้คือไอเท็มไอเท็มทั้งหมด) หากความคาดหวังคือผลลัพธ์ของตัวแปรข้อมูลจะเป็น 'จริง' หรือ 'เท็จ' แทนค่าที่ผิดพลาดคุณจะผิดหวังอย่างมาก
adamgede

ขอบคุณ! งานของฉันแตกต่างกันเล็กน้อย รับดัชนีของ Object in the Array => push if <0 || splice(index, 1)นี่คือรหัสที่อัปเดตของฉันเล็กน้อย:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Leonid Zadorozhnykh

30

นี่คือวิธีที่ฉันทำ

const found = vendors.some(item => item.Name === 'Magenic');

array.some()วิธีการตรวจสอบว่ามีอย่างน้อยหนึ่งค่าในอาร์เรย์ที่ตรงกับเกณฑ์และส่งกลับแบบบูล จากที่นี่คุณสามารถไปกับ:

if (found) {
// do something
} else {
// do something else
}

22

นอกจากว่าคุณต้องการที่จะปรับโครงสร้างเช่นนี้:

vendors = {
    Magenic: {
      Name: 'Magenic',
      ID: 'ABC'
     },
    Microsoft: {
      Name: 'Microsoft',
      ID: 'DEF'
    } and so on... 
};

ซึ่งคุณสามารถทำได้ if(vendors.Magnetic)

คุณจะต้องวนซ้ำ


2
ในกรณีที่เขายังต้องการบำรุงรักษาโครงสร้างวัตถุเพื่อใช้งานที่อื่น
Keith.Abramo

21

เป็นต่อ ECMAScript 6 findIndexสเปคที่คุณสามารถใช้

const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');

magenicIndexจะถืออย่างใดอย่างหนึ่ง0(ซึ่งเป็นดัชนีในอาร์เรย์) หรือ-1ถ้ามันไม่พบ


เพียงเพื่อทำให้ผู้คนตระหนักว่า 0 จะยังคงจับคู่กันเป็นผลลัพธ์ที่ผิดหากถูกใช้เป็นเงื่อนไข ด้วยเหตุนี้ฉันจึงคิดว่า find () ดีกว่าเพราะคุณได้รับการประเมินความจริงที่สมเหตุสมผลมากกว่า
dhj

15

ในฐานะที่เป็น OP ได้ถามคำถามว่ากุญแจอยู่หรือไม่ถ้าคีย์มีอยู่หรือไม่

วิธีการแก้ปัญหาที่หรูหรามากขึ้นที่จะกลับมาบูลีนโดยใช้ฟังก์ชั่นลด ES6 สามารถ

const magenicVendorExists =  vendors.reduce((accumulator, vendor) => (accumulator||vendor.Name === "Magenic"), false);

หมายเหตุ: พารามิเตอร์เริ่มต้นของการลดคือfalseและถ้าอาร์เรย์มีคีย์มันจะคืนค่าจริง

หวังว่าจะช่วยให้การใช้รหัสดีขึ้นและสะอาดขึ้น


1
ตั้งแต่เมื่อไหร่ !! [] เท่ากับเท็จ?
Sergey

1
รับได้สวย. อัปเดตคำตอบโดยใช้การลด :)
Jay Chakra

1
นี่เป็นสิ่งที่ผิด พารามิเตอร์แรกที่reduceเป็นตัวสะสมไม่ใช่vendorวัตถุ นี้จะตรวจสอบfalse.Name === "Magenic"ในทุกวงและจะส่งกลับเท็จ
adiga

@adiga: แก้ไขแล้ว
Jay Chakra

1
โปรดตรวจสอบวิธีแก้ปัญหาของ Mirza Leka ด้วย ทางออกที่สง่างามกว่ามาก
Jay Chakra

13

คุณไม่สามารถมองเข้าไปในวัตถุโดยไม่ได้จริงๆ

คุณควรเปลี่ยนโครงสร้างเล็กน้อยเช่น

vendors = {
    Magenic:   'ABC',
    Microsoft: 'DEF'
};

จากนั้นคุณสามารถใช้มันเหมือนการค้นหาแบบแฮช

vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined

6

อาจจะสายเกินไป แต่อาร์เรย์ javascript มีสองวิธีsomeและeveryวิธีที่ส่งกลับค่าบูลีนและสามารถช่วยให้คุณทำสิ่งนี้ได้

ฉันคิดว่าsomeจะเหมาะสมที่สุดสำหรับสิ่งที่คุณตั้งใจจะทำให้สำเร็จ

vendors.some( vendor => vendor['Name'] !== 'Magenic' )

บางคนตรวจสอบว่าวัตถุใด ๆ ในอาร์เรย์เป็นไปตามเงื่อนไขที่กำหนด

vendors.every( vendor => vendor['Name'] !== 'Magenic' )

ทุกการตรวจสอบว่าวัตถุทั้งหมดในอาร์เรย์เป็นไปตามเงื่อนไขที่กำหนด


มันไม่ทำงานconst array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));มันควรกลับมาจริง
Thanwa Ch

เพื่อนขอโทษฉันหมายถึงsomeจะปรับปรุงคำตอบของฉัน
Akinjiola Toni

5

คุณต้องวนลูปไม่มีทางรอบ ๆ มัน

function seekVendor(vendors, name) {
  for (var i=0, l=vendors.length; i<l; i++) {
    if (typeof vendors[i] == "object" && vendors[i].Name === name) {
      return vendors[i];
    }
  }
}

แน่นอนคุณสามารถใช้ไลบรารี่เช่นlinq.jsเพื่อทำให้สิ่งนี้เป็นที่ชื่นชอบมากขึ้น:

Enumerable.From(vendors).Where("$.Name == 'Magenic'").First();

(ดูjsFiddleสำหรับตัวอย่าง)

ฉันสงสัยว่า linq.js จะเร็วกว่าการวนซ้ำไปข้างหน้าอย่างแน่นอน แต่แน่นอนว่ามีความยืดหยุ่นมากขึ้นเมื่อสิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเล็กน้อย


5

การทดสอบองค์ประกอบอาร์เรย์:

JS เสนอฟังก์ชันอาเรย์ที่ช่วยให้คุณสามารถทำสิ่งนี้ได้ง่าย พวกเขามีดังต่อไปนี้:

  1. Array.prototype.filter: ใช้ฟังก์ชั่นการโทรกลับซึ่งเป็นการทดสอบอาร์เรย์จะถูกทำซ้ำด้วยการโทรกลับและกรองตามการติดต่อกลับนี้ อาร์เรย์ที่ถูกกรองใหม่จะถูกส่งคืน
  2. Array.prototype.some: ใช้ฟังก์ชั่นการโทรกลับซึ่งเป็นการทดสอบอาร์เรย์จะถูกทำซ้ำด้วยการโทรกลับและหากองค์ประกอบใด ๆ ผ่านการทดสอบ บูลีนจริงจะถูกส่งกลับ มิฉะนั้นจะถูกส่งคืนเท็จ

ข้อมูลเฉพาะจะอธิบายได้ดีที่สุดผ่านตัวอย่าง:

ตัวอย่าง:

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    } //and so on goes array... 
];

// filter returns a new array, we instantly check if the length 
// is longer than zero of this newly created array
if (vendors.filter(company => company.Name === 'Magenic').length ) {
  console.log('I contain Magenic');
}

// some would be a better option then filter since it directly returns a boolean
if (vendors.some(company => company.Name === 'Magenic')) {
  console.log('I also contain Magenic');
}

การสนับสนุนเบราว์เซอร์:

ฟังก์ชั่น 2 เหล่านี้เป็นES6ฟังก์ชั่นเบราว์เซอร์อาจไม่สนับสนุน เพื่อเอาชนะสิ่งนี้คุณสามารถใช้ polyfill นี่คือ polyfill สำหรับArray.prototype.some(จาก MDN):

if (!Array.prototype.some) {
  Array.prototype.some = function(fun, thisArg) {
    'use strict';

    if (this == null) {
      throw new TypeError('Array.prototype.some called on null or undefined');
    }

    if (typeof fun !== 'function') {
      throw new TypeError();
    }

    var t = Object(this);
    var len = t.length >>> 0;

    for (var i = 0; i < len; i++) {
      if (i in t && fun.call(thisArg, t[i], i, t)) {
        return true;
      }
    }

    return false;
  };
}


4

หากคุณกำลังใช้ jQuery คุณสามารถใช้ประโยชน์จาก grep เพื่อสร้างอาร์เรย์ที่มีวัตถุที่ตรงกันทั้งหมด:

var results = $.grep(vendors, function (e) {
    return e.Name == "Magenic";
});

แล้วใช้อาร์เรย์ผลลัพธ์:

for (var i=0, l=results.length; i<l; i++) {
    console.log(results[i].ID);
}

3

ถูกต้องฉันถ้าฉันผิด .. ฉันสามารถใช้forEachวิธีการเช่นนี้

var found=false;
vendors.forEach(function(item){
   if(item.name === "name"){
       found=true;

   }
});

ทุกวันนี้ฉันเคยชินกับมันเพราะมันเป็นคำที่เรียบง่ายและอธิบายตนเอง ขอบคุณ.


1
หมายเหตุ: ไม่มีการคืนสินค้าที่นี่
Edison

2

คุณสามารถลองใช้งานได้สำหรับฉัน

const _ = require('lodash');

var arr = [
  {
    name: 'Jack',
    id: 1
  },
  {
    name: 'Gabriel',
    id: 2
  },
  {
    name: 'John',
    id: 3
  }
]

function findValue(arr,value) {
  return _.filter(arr, function (object) {
    return object['name'].toLowerCase().indexOf(value.toLowerCase()) >= 0;
  });
}

console.log(findValue(arr,'jack'))
//[ { name: 'Jack', id: 1 } ]

นี่เป็นคำถามที่เก่ามากและฉันคิดว่าการอัปเดตนั้นมีทางออกที่ดีที่สุดในปัจจุบัน
Federico Galfione

1

คุณสามารถใช้lodash หากห้องสมุด lodash หนักเกินไปสำหรับแอปพลิเคชันของคุณให้พิจารณาฟังก์ชันที่ไม่จำเป็นซึ่งไม่จำเป็น

let newArray = filter(_this.props.ArrayOne, function(item) {
                    return find(_this.props.ArrayTwo, {"speciesId": item.speciesId});
                });

นี่เป็นวิธีเดียวในการทำเช่นนี้ อีกคนสามารถ:

var newArray=  [];
     _.filter(ArrayOne, function(item) {
                        return AllSpecies.forEach(function(cItem){
                            if (cItem.speciesId == item.speciesId){
                            newArray.push(item);
                          }
                        }) 
                    });

console.log(arr);

ตัวอย่างข้างต้นสามารถเขียนใหม่ได้โดยไม่ต้องใช้ไลบรารีใด ๆเช่น:

var newArray=  [];
ArrayOne.filter(function(item) {
                return ArrayTwo.forEach(function(cItem){
                    if (cItem.speciesId == item.speciesId){
                    newArray.push(item);
                  }
                }) 
            });
console.log(arr);

หวังว่าคำตอบของฉันจะช่วย


1

คำตอบมากมายที่นี่ดีและค่อนข้างง่าย แต่ถ้าอาร์เรย์ของออบเจ็กต์ของคุณมีชุดค่าคงที่คุณสามารถใช้เคล็ดลับด้านล่าง:

แม็พชื่อทั้งหมดในวัตถุ

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    }
];

var dirtyObj = {}
for(var count=0;count<vendors.length;count++){
   dirtyObj[vendors[count].Name] = true //or assign which gives you true.
}

ทีนี้เจ้าสกปรกนี่คุณสามารถใช้ซ้ำแล้วซ้ำอีกได้โดยไม่ต้องวนซ้ำ

if(dirtyObj[vendor.Name]){
  console.log("Hey! I am available.");
}

1

ในการเปรียบเทียบวัตถุหนึ่งกับวัตถุอื่นฉันรวม a for in loop (ใช้ในการวนซ้ำวัตถุ) และวัตถุบางอย่าง () คุณไม่ต้องกังวลเกี่ยวกับอาร์เรย์ที่ออกนอกขอบเขต ฯลฯ ดังนั้นจะบันทึกรหัสบางส่วน เอกสารเกี่ยวกับ. some สามารถพบได้ที่นี่

var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];    
var  objectsFound = [];

for(let objectNumber in productList){
    var currentId = productList[objectNumber].id;   
    if (theDatabaseList.some(obj => obj.id === currentId)) {
        // Do what you need to do with the matching value here
        objectsFound.push(currentId);
    }
}
console.log(objectsFound);

อีกวิธีหนึ่งที่ฉันเปรียบเทียบวัตถุหนึ่งไปยังอีกวัตถุหนึ่งคือการใช้ซ้อนสำหรับลูปกับ Object.keys (). length เพื่อรับจำนวนของวัตถุในอาร์เรย์ รหัสด้านล่าง:

var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];    
var objectsFound = [];

for(var i = 0; i < Object.keys(productList).length; i++){
        for(var j = 0; j < Object.keys(theDatabaseList).length; j++){
        if(productList[i].id === theDatabaseList[j].id){
            objectsFound.push(productList[i].id);
        }       
    }
}
console.log(objectsFound);

เพื่อตอบคำถามที่ถูกต้องของคุณหากเพียงแค่ค้นหาค่าในวัตถุคุณสามารถใช้หนึ่งในการวนซ้ำ

var vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    } 
];

for(var ojectNumbers in vendors){
    if(vendors[ojectNumbers].Name === 'Magenic'){
        console.log('object contains Magenic');
    }
}

0

หรือคุณสามารถทำได้:

const find = (key, needle) => return !!~vendors.findIndex(v => (v[key] === needle));

1
คุณควรที่จะบอกว่าทำไมเขาถึงทำอย่างนั้นได้
Azzabi Haythem

0

var without2 = (arr, args) => arr.filter(v => v.id !== args.id); ตัวอย่าง:

without2([{id:1},{id:1},{id:2}],{id:2})

ผลลัพธ์: without2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})


ฉันคิดว่าคุณตั้งใจจะพูดผลลัพธ์: [{id: 1}, {id: 1}]
Isaac Pak

0
const a = [{one:2},{two:2},{two:4}]
const b = a.filter(val => "two" in val).length;
if (b) {
   ...
}

3
กรุณาและคำอธิบายบางอย่างและให้แน่ใจว่าตัวอย่างที่คุณให้ผลงาน .. (ตัวกรองจะไม่เปลี่ยนอาร์เรย์เดิม แต่โคลนมัน)
Moshe Simantov

-1

แนวทางของฉันในการแก้ปัญหานี้คือใช้ ES6 และสร้างฟังก์ชันที่ทำหน้าที่ตรวจสอบเรา ประโยชน์ของฟังก์ชั่นนี้คือมันสามารถนำกลับมาใช้ใหม่ได้ตลอดโครงการของคุณเพื่อตรวจสอบอาร์เรย์ของวัตถุใด ๆ ที่ให้keyและการvalueตรวจสอบ

พอคุยกันดูรหัสกันเถอะ

แถว

const ceos = [
  {
    name: "Jeff Bezos",
    company: "Amazon"
  }, 
  {
    name: "Mark Zuckerberg",
    company: "Facebook"
  }, 
  {
    name: "Tim Cook",
    company: "Apple"
  }
];

ฟังก์ชัน

const arrayIncludesInObj = (arr, key, valueToCheck) => {
  let found = false;

  arr.some(value => {
    if (value[key] === valueToCheck) {
      found = true;
      return true; // this will break the loop once found
    }
  });

  return found;
}

โทร / การใช้งาน

const found = arrayIncludesInObj(ceos, "name", "Tim Cook"); // true

const found = arrayIncludesInObj(ceos, "name", "Tim Bezos"); // false

-4

ฉันอยากจะไปกับ regex

หากรหัสของคุณเป็นดังนี้

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    }
];

ฉันจะแนะนำ

/"Name":"Magenic"/.test(JSON.stringify(vendors))

23
บางคนเมื่อเผชิญกับปัญหาคิดว่า "ฉันรู้ฉันจะใช้สำนวนปกติ" ตอนนี้พวกเขามีสองปัญหา
Craicerjack

ยื่นใต้สิ่งนี้เพียงเพราะคุณสามารถทำอะไรบางอย่างไม่ได้หมายความว่าคุณควรทำ
เลียม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.